Etude de la marche chez l'enfant¶
Présentation de l'étude¶
Ce rapport vise à analyser l’initiation de la marche chez des enfants âgés de 6 à 12 ans, en comparant les enfants neurotypiques et ceux atteints de troubles du spectre de l’autisme (TSA). L’initiation de la marche est une phase clé qui permet d’évaluer la coordination motrice et l’anticipation du mouvement à travers des paramètres biomécaniques mesurés par une plateforme de force et un système d’analyse du mouvement.
L’étude repose sur un ensemble de données recueillies auprès de 30 enfants, mettant en avant les déplacements du centre de pression (CoP) dans différentes directions ainsi que la durée des phases de chargement et de déchargement. L’objectif est d’examiner l’influence de l’âge sur ces paramètres et de déterminer les méthodes les plus adaptées pour leur interprétation.
Dans ce contexte, plusieurs analyses seront menées :
- Choix des différentes méthodes pour retenir l’essai le plus pertinents.
- Vérification de la qualité des données et correction des anomalies.
- Analyse de l’effet de l’âge sur l’anticipation du mouvement en comparant des groupes d’âge définis et en testant d’autres approches statistiques.
- Évaluation de l’impact de l’âge sur des paramètres anthropométriques tels que la taille et le poids, afin d’isoler leur influence potentielle sur les résultats.
Les choix méthodologiques et les analyses statistiques seront justifiés en s’appuyant sur la littérature scientifique et les meilleures pratiques en matière de traitement des données biomécaniques.
2. Données descriptives¶
2.1 Méthodes de sélection de l’essai le plus représentatif¶
Pour choisir l’essai le plus pertinent, plusieurs méthodes sont utilisées. La moyenne est simple et représente la tendance centrale, mais elle est sensible aux valeurs extrêmes. La médiane est plus robuste face aux outliers, bien qu’elle ignore la variabilité. Une autre approche consiste à sélectionner l’essai le plus proche de la moyenne ou de la médiane, garantissant une performance typique. Enfin, certaines études privilégient l’essai le plus stable ou le plus performant, selon l’objectif recherché.
2.2 Nettoyage des données¶
import pandas as pd
# Importer les données
TD_Res = pd.read_excel("/content/RES_all_cleaned.xlsx")
# Afficher les données
TD_Res.head()
| GROUPE | Sujet | Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | ... | Total_Affect social | Score CRR | Score total | ADOS SCORE COMPARAISON | Manque de réciprocité socio-émotionnelle | Communication.1 | Comportements répétitifs et patterns stéréotypés | Anomalies dvp avt 36m | SIM | MAT | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TD | TD1 | 10.90 | 2 | 517 | 475 | 992 | 366 | 151 | 0.032708 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 14.0 | 7.0 |
| 1 | TD | TD2 | 9.20 | 1 | 465 | 389 | 854 | 245 | 220 | 0.069070 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 11.0 | 8.0 |
| 2 | TD | TD3 | 10.10 | 2 | 545 | 541 | 1086 | 215 | 330 | 0.034305 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 12.0 | 8.0 |
| 3 | TD | TD4 | 10.05 | 1 | 471 | 201 | 672 | 273 | 198 | 0.014398 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 11.0 | 8.0 |
| 4 | TD | TD5 | 6.10 | 1 | 444 | 201 | 645 | 226 | 218 | 0.051200 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5.0 | 9.0 |
5 rows × 82 columns
# Afficher un résumé des données
print(TD_Res.info()) # Donne des infos sur les types de données et les valeurs manquantes
<class 'pandas.core.frame.DataFrame'> RangeIndex: 30 entries, 0 to 29 Data columns (total 82 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 GROUPE 30 non-null object 1 Sujet 30 non-null object 2 Age 30 non-null float64 3 Sexe 30 non-null int64 4 TAju.ms 30 non-null int64 5 TExe.ms 30 non-null int64 6 TPas.ms 30 non-null int64 7 TLoad.ms 30 non-null int64 8 TUnload.ms 30 non-null int64 9 CoP_tot_AP.Long 30 non-null float64 10 CoP_tot_ML.Larg 30 non-null float64 11 CoP_loadAP.Long 30 non-null float64 12 CoP_load_ML.Larg 30 non-null float64 13 CoP_unload_ML.Larg 30 non-null float64 14 Vpic_load_AP.ms 30 non-null float64 15 Vpic_load_ML.ms 30 non-null float64 16 Vpic_unload_ML.ms 30 non-null float64 17 BOS_AP_Init.m 30 non-null float64 18 BOS_ML_Init.m 30 non-null float64 19 MOS_AP_FOcr.Long 29 non-null float64 20 MOS_ML_FOcr.Larg 30 non-null float64 21 AGE_AB 30 non-null float64 22 Group AGE 30 non-null object 23 CLASSE 30 non-null object 24 Weight 30 non-null float64 25 Height 30 non-null float64 26 Epaule 30 non-null int64 27 Coude 30 non-null int64 28 Poignet 30 non-null int64 29 Main 30 non-null int64 30 MID 30 non-null float64 31 MIG 30 non-null float64 32 Fctelle 29 non-null float64 33 MANUALITE 29 non-null float64 34 QTAC 29 non-null float64 35 TAC 29 non-null float64 36 Inattention 29 non-null float64 37 Hyperactivité 29 non-null float64 38 Pb apprentissage 29 non-null float64 39 Pb fct exécutif 29 non-null float64 40 Agressivité 29 non-null float64 41 Pb sociaux 29 non-null float64 42 Index global Conners 3 Total 29 non-null float64 43 DSM-IV-TR Inattention 29 non-null float64 44 DSM-IV-TR Impulsivité-Hyperactivité 29 non-null float64 45 DSM-IV-TR Trouble des conduites 29 non-null float64 46 DSM-IV-TR Trble oppositionprovocation 29 non-null float64 47 Anxiete 27 non-null float64 48 Depression 27 non-null float64 49 Inhibition 29 non-null float64 50 Flexibilité 29 non-null float64 51 Contrôle émotionnel 29 non-null float64 52 Indice Régulation Comportementale .IRC 29 non-null float64 53 Initiation 29 non-null float64 54 MDT 29 non-null float64 55 Planification Organisation 29 non-null float64 56 Organisation matérielle 29 non-null float64 57 Contrôle 29 non-null float64 58 Indice de méatacognition .IMC 29 non-null float64 59 CEG = IRC+IMC 29 non-null float64 60 Négativité 29 non-null float64 61 Incohérence 29 non-null float64 62 AWR 3 non-null float64 63 COG 3 non-null float64 64 COM 3 non-null float64 65 MOT 3 non-null float64 66 RRB 3 non-null float64 67 SCI 3 non-null float64 68 TOT 3 non-null float64 69 Module ADOS 0 non-null float64 70 Communication 0 non-null float64 71 Inter Sociale Reciproque 0 non-null float64 72 Total_Affect social 0 non-null float64 73 Score CRR 0 non-null float64 74 Score total 0 non-null float64 75 ADOS SCORE COMPARAISON 0 non-null float64 76 Manque de réciprocité socio-émotionnelle 0 non-null float64 77 Communication.1 0 non-null float64 78 Comportements répétitifs et patterns stéréotypés 0 non-null float64 79 Anomalies dvp avt 36m 0 non-null float64 80 SIM 29 non-null float64 81 MAT 29 non-null float64 dtypes: float64(68), int64(10), object(4) memory usage: 19.3+ KB None
TD_Res.describe()
| Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | CoP_tot_ML.Larg | CoP_loadAP.Long | ... | Total_Affect social | Score CRR | Score total | ADOS SCORE COMPARAISON | Manque de réciprocité socio-émotionnelle | Communication.1 | Comportements répétitifs et patterns stéréotypés | Anomalies dvp avt 36m | SIM | MAT | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | ... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 29.000000 | 29.000000 |
| mean | 8.609333 | 1.566667 | 502.866667 | 288.200000 | 791.066667 | 289.200000 | 202.466667 | 0.041073 | 0.113465 | 0.195808 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 12.482759 | 12.241379 |
| std | 1.714623 | 0.504007 | 97.402731 | 109.350875 | 148.198360 | 80.546581 | 104.676425 | 0.013806 | 0.021794 | 0.079954 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2.414549 | 2.798663 |
| min | 6.000000 | 1.000000 | 273.000000 | 201.000000 | 474.000000 | 137.000000 | -168.000000 | 0.014398 | 0.073276 | -0.005183 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5.000000 | 7.000000 |
| 25% | 7.137500 | 1.000000 | 455.000000 | 201.000000 | 673.750000 | 235.250000 | 148.750000 | 0.032430 | 0.098253 | 0.120784 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 12.000000 | 10.000000 |
| 50% | 8.350000 | 2.000000 | 507.500000 | 216.500000 | 752.000000 | 281.000000 | 203.000000 | 0.037639 | 0.111075 | 0.224284 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 13.000000 | 12.000000 |
| 75% | 10.177500 | 2.000000 | 543.250000 | 392.750000 | 889.250000 | 323.750000 | 262.250000 | 0.048384 | 0.130610 | 0.260647 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 14.000000 | 14.000000 |
| max | 11.080000 | 2.000000 | 827.000000 | 541.000000 | 1086.000000 | 475.000000 | 363.000000 | 0.073069 | 0.156527 | 0.304639 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 16.000000 | 19.000000 |
8 rows × 78 columns
On note 82 variables de type entier, décimal et objet étudié pour 30 enfants
D'après l'analyse initiale, voici les principales caractéristiques de notre échantillon :
Population étudiée :
30 enfants au total Âge : de 6 à 11,1 ans (moyenne de 8,6 ans) Répartition par sexe : 13 garçons (1) et 17 filles (2) Tous les enfants sont dans le groupe TD (Développement Typique)
print(TD_Res.describe(include='all')) # Statistiques descriptives pour toutes les colonnes
GROUPE Sujet Age Sexe TAju.ms TExe.ms \
count 30 30 30.000000 30.000000 30.000000 30.000000
unique 1 30 NaN NaN NaN NaN
top TD TD1 NaN NaN NaN NaN
freq 30 1 NaN NaN NaN NaN
mean NaN NaN 8.609333 1.566667 502.866667 288.200000
std NaN NaN 1.714623 0.504007 97.402731 109.350875
min NaN NaN 6.000000 1.000000 273.000000 201.000000
25% NaN NaN 7.137500 1.000000 455.000000 201.000000
50% NaN NaN 8.350000 2.000000 507.500000 216.500000
75% NaN NaN 10.177500 2.000000 543.250000 392.750000
max NaN NaN 11.080000 2.000000 827.000000 541.000000
TPas.ms TLoad.ms TUnload.ms CoP_tot_AP.Long ... \
count 30.000000 30.000000 30.000000 30.000000 ...
unique NaN NaN NaN NaN ...
top NaN NaN NaN NaN ...
freq NaN NaN NaN NaN ...
mean 791.066667 289.200000 202.466667 0.041073 ...
std 148.198360 80.546581 104.676425 0.013806 ...
min 474.000000 137.000000 -168.000000 0.014398 ...
25% 673.750000 235.250000 148.750000 0.032430 ...
50% 752.000000 281.000000 203.000000 0.037639 ...
75% 889.250000 323.750000 262.250000 0.048384 ...
max 1086.000000 475.000000 363.000000 0.073069 ...
Total_Affect social Score CRR Score total ADOS SCORE COMPARAISON \
count 0.0 0.0 0.0 0.0
unique NaN NaN NaN NaN
top NaN NaN NaN NaN
freq NaN NaN NaN NaN
mean NaN NaN NaN NaN
std NaN NaN NaN NaN
min NaN NaN NaN NaN
25% NaN NaN NaN NaN
50% NaN NaN NaN NaN
75% NaN NaN NaN NaN
max NaN NaN NaN NaN
Manque de réciprocité socio-émotionnelle Communication.1 \
count 0.0 0.0
unique NaN NaN
top NaN NaN
freq NaN NaN
mean NaN NaN
std NaN NaN
min NaN NaN
25% NaN NaN
50% NaN NaN
75% NaN NaN
max NaN NaN
Comportements répétitifs et patterns stéréotypés \
count 0.0
unique NaN
top NaN
freq NaN
mean NaN
std NaN
min NaN
25% NaN
50% NaN
75% NaN
max NaN
Anomalies dvp avt 36m SIM MAT
count 0.0 29.000000 29.000000
unique NaN NaN NaN
top NaN NaN NaN
freq NaN NaN NaN
mean NaN 12.482759 12.241379
std NaN 2.414549 2.798663
min NaN 5.000000 7.000000
25% NaN 12.000000 10.000000
50% NaN 13.000000 12.000000
75% NaN 14.000000 14.000000
max NaN 16.000000 19.000000
[11 rows x 82 columns]
Détection des anomalies¶
On constate qu'il y a plusieurs variables manquantes. Procédons donc à la détection d'anomalies et leurs corrections. De plus, on a constaté que le nom des variables avec des parenthèse peut poser problème, donc a remplacé les parenthèses par des points. De même pour les variables "weight", "MIG" & "MID" certaines valeurs sont avec des points d'autres avec des virgules, R a considérer ces variables comme qualitatif alors qu'elles ne le sont pas. Pour résoudre ce problème on a uniformiser les valeurs en mettant des virgules pour tous les nombres décimales.
# Calcul du nombre de valeurs manquantes par colonne
missing_values = TD_Res.isnull().sum()
# Création d'un DataFrame pour une meilleure lisibilité
missing_values_df = pd.DataFrame({'Variable': missing_values.index, 'Valeurs Manquantes': missing_values.values})
# Filtrer pour ne garder que les colonnes ayant au moins une valeur manquante
missing_values_df = missing_values_df[missing_values_df['Valeurs Manquantes'] > 0]
# Trier par ordre décroissant des valeurs manquantes
missing_values_df = missing_values_df.sort_values(by='Valeurs Manquantes', ascending=False)
# Affichage
missing_values_df
| Variable | Valeurs Manquantes | |
|---|---|---|
| 69 | Module ADOS | 30 |
| 75 | ADOS SCORE COMPARAISON | 30 |
| 70 | Communication | 30 |
| 72 | Total_Affect social | 30 |
| 73 | Score CRR | 30 |
| 74 | Score total | 30 |
| 71 | Inter Sociale Reciproque | 30 |
| 76 | Manque de réciprocité socio-émotionnelle | 30 |
| 77 | Communication.1 | 30 |
| 78 | Comportements répétitifs et patterns stéréotypés | 30 |
| 79 | Anomalies dvp avt 36m | 30 |
| 62 | AWR | 27 |
| 68 | TOT | 27 |
| 67 | SCI | 27 |
| 66 | RRB | 27 |
| 65 | MOT | 27 |
| 64 | COM | 27 |
| 63 | COG | 27 |
| 47 | Anxiete | 3 |
| 48 | Depression | 3 |
| 60 | Négativité | 1 |
| 61 | Incohérence | 1 |
| 19 | MOS_AP_FOcr.Long | 1 |
| 58 | Indice de méatacognition .IMC | 1 |
| 80 | SIM | 1 |
| 59 | CEG = IRC+IMC | 1 |
| 56 | Organisation matérielle | 1 |
| 57 | Contrôle | 1 |
| 32 | Fctelle | 1 |
| 33 | MANUALITE | 1 |
| 34 | QTAC | 1 |
| 35 | TAC | 1 |
| 36 | Inattention | 1 |
| 37 | Hyperactivité | 1 |
| 38 | Pb apprentissage | 1 |
| 39 | Pb fct exécutif | 1 |
| 40 | Agressivité | 1 |
| 41 | Pb sociaux | 1 |
| 42 | Index global Conners 3 Total | 1 |
| 43 | DSM-IV-TR Inattention | 1 |
| 44 | DSM-IV-TR Impulsivité-Hyperactivité | 1 |
| 45 | DSM-IV-TR Trouble des conduites | 1 |
| 46 | DSM-IV-TR Trble oppositionprovocation | 1 |
| 49 | Inhibition | 1 |
| 50 | Flexibilité | 1 |
| 51 | Contrôle émotionnel | 1 |
| 52 | Indice Régulation Comportementale .IRC | 1 |
| 53 | Initiation | 1 |
| 54 | MDT | 1 |
| 55 | Planification Organisation | 1 |
| 81 | MAT | 1 |
# Créez un dictionnaire pour stocker les résultats
resultats = {}
# Liste des nombres de valeurs manquantes à rechercher
nombres_manquants = [30, 27, 3, 1]
# Parcourez la liste des nombres manquants
for nombre in nombres_manquants:
# Comptez le nombre de variables ayant ce nombre de valeurs manquantes
nombre_variables = (missing_values_df['Valeurs Manquantes'] == nombre).sum()
# Stockez le résultat dans le dictionnaire
resultats[nombre] = nombre_variables
# Affichez les résultats
for nombre, nombre_variables in resultats.items():
print(f"Nombre de variables avec {nombre} valeurs manquantes : {nombre_variables}")
Nombre de variables avec 30 valeurs manquantes : 11 Nombre de variables avec 27 valeurs manquantes : 7 Nombre de variables avec 3 valeurs manquantes : 2 Nombre de variables avec 1 valeurs manquantes : 31
# @title Valeurs Manquantes
import matplotlib.pyplot as plt
import seaborn as sns
# Créer le graphique
plt.figure(figsize=(10, 6))
ax = sns.barplot(x='Variable', y='Valeurs Manquantes', data=missing_values_df, palette="husl")
# Ajouter un titre et des labels
plt.title('Nombre de Valeurs Manquantes par Variable', fontsize=14)
plt.xlabel('Variables', fontsize=12)
plt.ylabel('Nombre de Valeurs Manquantes', fontsize=12)
# Incliner les labels des variables sur l'axe Y pour plus de clarté
plt.xticks(rotation=90)
# Adding annotations
for i, value in enumerate(missing_values_df['Valeurs Manquantes']):
plt.text(i, value + 0.1, str(value), ha='center')
plt.show()
# Afficher le graphique
plt.tight_layout()
plt.show()
<ipython-input-8-faa6f45df0f6>:8: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. ax = sns.barplot(x='Variable', y='Valeurs Manquantes', data=missing_values_df, palette="husl")
<Figure size 640x480 with 0 Axes>
Gestion des valeurs manquantes
Les variables n'ayant aucune valeurs (30 valeurs manquantes ) de même que les variables ayant 27 valeurs manquantes sont supprimés. Notons que ces derniers concernent l'évaluation de l'autisme (SRR), qu'on verra dans une autre étude.
# # Filtrer les colonnes avec moins de 27 valeurs manquantes
TD_Res_cleaned = TD_Res.loc[:, missing_values < 27]
# Vérifier le résultat
TD_Res_cleaned.head()
| GROUPE | Sujet | Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | ... | MDT | Planification Organisation | Organisation matérielle | Contrôle | Indice de méatacognition .IMC | CEG = IRC+IMC | Négativité | Incohérence | SIM | MAT | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TD | TD1 | 10.90 | 2 | 517 | 475 | 992 | 366 | 151 | 0.032708 | ... | 56.0 | 73.0 | 79.0 | 51.0 | 63.0 | 60.0 | 0.0 | 4.0 | 14.0 | 7.0 |
| 1 | TD | TD2 | 9.20 | 1 | 465 | 389 | 854 | 245 | 220 | 0.069070 | ... | 44.0 | 49.0 | 47.0 | 48.0 | 45.0 | 44.0 | 0.0 | 2.0 | 11.0 | 8.0 |
| 2 | TD | TD3 | 10.10 | 2 | 545 | 541 | 1086 | 215 | 330 | 0.034305 | ... | 41.0 | 38.0 | 66.0 | 48.0 | 45.0 | 45.0 | 1.0 | 4.0 | 12.0 | 8.0 |
| 3 | TD | TD4 | 10.05 | 1 | 471 | 201 | 672 | 273 | 198 | 0.014398 | ... | 60.0 | 60.0 | 48.0 | 51.0 | 59.0 | 55.0 | 0.0 | 1.0 | 11.0 | 8.0 |
| 4 | TD | TD5 | 6.10 | 1 | 444 | 201 | 645 | 226 | 218 | 0.051200 | ... | 53.0 | 44.0 | 57.0 | 52.0 | 71.0 | 55.0 | 1.0 | 7.0 | 5.0 | 9.0 |
5 rows × 64 columns
Nous feront une imputation pour les valeurs manquantes restantes
from sklearn.impute import KNNImputer
import pandas as pd
# Séparer les variables numériques et qualitatives
df_numeric = TD_Res_cleaned.select_dtypes(include=['number'])
df_categorical = TD_Res_cleaned.select_dtypes(exclude=['number'])
# Appliquer KNN Imputer (choix de k = 5, peut être ajusté)
knn_imputer = KNNImputer(n_neighbors=5)
df_numeric_imputed = pd.DataFrame(knn_imputer.fit_transform(df_numeric), columns=df_numeric.columns)
# Identifier les colonnes qui étaient entières dans df_numeric AVANT l'imputation
integer_columns = [col for col in df_numeric.columns if pd.api.types.is_integer_dtype(df_numeric[col])]
# Arrondir ces colonnes après l'imputation
df_numeric_imputed[integer_columns] = df_numeric_imputed[integer_columns].round().astype(int)
# Fusionner les données imputées avec les variables qualitatives
df_final = pd.concat([df_categorical, df_numeric_imputed], axis=1)
# Vérifier que toutes les colonnes sont bien réintégrées
print(df_final.info())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 30 entries, 0 to 29 Data columns (total 64 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 GROUPE 30 non-null object 1 Sujet 30 non-null object 2 Group AGE 30 non-null object 3 CLASSE 30 non-null object 4 Age 30 non-null float64 5 Sexe 30 non-null int64 6 TAju.ms 30 non-null int64 7 TExe.ms 30 non-null int64 8 TPas.ms 30 non-null int64 9 TLoad.ms 30 non-null int64 10 TUnload.ms 30 non-null int64 11 CoP_tot_AP.Long 30 non-null float64 12 CoP_tot_ML.Larg 30 non-null float64 13 CoP_loadAP.Long 30 non-null float64 14 CoP_load_ML.Larg 30 non-null float64 15 CoP_unload_ML.Larg 30 non-null float64 16 Vpic_load_AP.ms 30 non-null float64 17 Vpic_load_ML.ms 30 non-null float64 18 Vpic_unload_ML.ms 30 non-null float64 19 BOS_AP_Init.m 30 non-null float64 20 BOS_ML_Init.m 30 non-null float64 21 MOS_AP_FOcr.Long 30 non-null float64 22 MOS_ML_FOcr.Larg 30 non-null float64 23 AGE_AB 30 non-null float64 24 Weight 30 non-null float64 25 Height 30 non-null float64 26 Epaule 30 non-null int64 27 Coude 30 non-null int64 28 Poignet 30 non-null int64 29 Main 30 non-null int64 30 MID 30 non-null float64 31 MIG 30 non-null float64 32 Fctelle 30 non-null float64 33 MANUALITE 30 non-null float64 34 QTAC 30 non-null float64 35 TAC 30 non-null float64 36 Inattention 30 non-null float64 37 Hyperactivité 30 non-null float64 38 Pb apprentissage 30 non-null float64 39 Pb fct exécutif 30 non-null float64 40 Agressivité 30 non-null float64 41 Pb sociaux 30 non-null float64 42 Index global Conners 3 Total 30 non-null float64 43 DSM-IV-TR Inattention 30 non-null float64 44 DSM-IV-TR Impulsivité-Hyperactivité 30 non-null float64 45 DSM-IV-TR Trouble des conduites 30 non-null float64 46 DSM-IV-TR Trble oppositionprovocation 30 non-null float64 47 Anxiete 30 non-null float64 48 Depression 30 non-null float64 49 Inhibition 30 non-null float64 50 Flexibilité 30 non-null float64 51 Contrôle émotionnel 30 non-null float64 52 Indice Régulation Comportementale .IRC 30 non-null float64 53 Initiation 30 non-null float64 54 MDT 30 non-null float64 55 Planification Organisation 30 non-null float64 56 Organisation matérielle 30 non-null float64 57 Contrôle 30 non-null float64 58 Indice de méatacognition .IMC 30 non-null float64 59 CEG = IRC+IMC 30 non-null float64 60 Négativité 30 non-null float64 61 Incohérence 30 non-null float64 62 SIM 30 non-null float64 63 MAT 30 non-null float64 dtypes: float64(50), int64(10), object(4) memory usage: 15.1+ KB None
df_final.head() #affichage de ma nouvelle base
| GROUPE | Sujet | Group AGE | CLASSE | Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | ... | MDT | Planification Organisation | Organisation matérielle | Contrôle | Indice de méatacognition .IMC | CEG = IRC+IMC | Négativité | Incohérence | SIM | MAT | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TD | TD1 | 10-11y | CM2 | 10.90 | 2 | 517 | 475 | 992 | 366 | ... | 56.0 | 73.0 | 79.0 | 51.0 | 63.0 | 60.0 | 0.0 | 4.0 | 14.0 | 7.0 |
| 1 | TD | TD2 | 8-9y | CM1 | 9.20 | 1 | 465 | 389 | 854 | 245 | ... | 44.0 | 49.0 | 47.0 | 48.0 | 45.0 | 44.0 | 0.0 | 2.0 | 11.0 | 8.0 |
| 2 | TD | TD3 | 10-11y | CM2 | 10.10 | 2 | 545 | 541 | 1086 | 215 | ... | 41.0 | 38.0 | 66.0 | 48.0 | 45.0 | 45.0 | 1.0 | 4.0 | 12.0 | 8.0 |
| 3 | TD | TD4 | 10-11y | CM2 | 10.05 | 1 | 471 | 201 | 672 | 273 | ... | 60.0 | 60.0 | 48.0 | 51.0 | 59.0 | 55.0 | 0.0 | 1.0 | 11.0 | 8.0 |
| 4 | TD | TD5 | 6-7y | CE1 | 6.10 | 1 | 444 | 201 | 645 | 226 | ... | 53.0 | 44.0 | 57.0 | 52.0 | 71.0 | 55.0 | 1.0 | 7.0 | 5.0 | 9.0 |
5 rows × 64 columns
df_final.isnull().sum()
| 0 | |
|---|---|
| GROUPE | 0 |
| Sujet | 0 |
| Group AGE | 0 |
| CLASSE | 0 |
| Age | 0 |
| ... | ... |
| CEG = IRC+IMC | 0 |
| Négativité | 0 |
| Incohérence | 0 |
| SIM | 0 |
| MAT | 0 |
64 rows × 1 columns
Détection de doublons
# Vérifiez les doublons en fonction de toutes les colonnes
duplicates = df_final[df_final.duplicated(keep=False)]
if not duplicates.empty:
print("Les lignes dupliquées trouvées:")
print(duplicates)
else:
print("Pas de lignes dupliquées trouvées.")
Pas de lignes dupliquées trouvées.
Nous n'avons détecter aucun doublon. Vérifions s'il y a des outliers avec IQR (Interquartile Range) et les boxplot
Détection de ouitliers
import numpy as np
import pandas as pd
# Sélectionner uniquement les colonnes numériques
df_numeric = df_final.select_dtypes(include=['number']).copy()
# Détection des outliers et remplacement par NaN
outliers_dict = {}
for col in df_numeric.columns:
Q1 = np.percentile(df_numeric[col].dropna(), 25) # Premier quartile
Q3 = np.percentile(df_numeric[col].dropna(), 75) # Troisième quartile
IQR = Q3 - Q1 # Intervalle interquartile
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# Identifier les valeurs aberrantes et les remplacer par NaN
outliers = df_numeric[(df_numeric[col] < lower_bound) | (df_numeric[col] > upper_bound)]
if not outliers.empty: # S'il y a des outliers
outliers_dict[col] = len(outliers)
df_numeric.loc[(df_numeric[col] < lower_bound) | (df_numeric[col] > upper_bound), col] = np.nan # Remplacer par NaN
# Afficher le nombre d'outliers détectés par variable
print("Nombre d'outliers détectés par variable :")
print(outliers_dict)
Nombre d'outliers détectés par variable :
{'TAju.ms': 3, 'TLoad.ms': 2, 'CoP_tot_AP.Long': 1, 'CoP_unload_ML.Larg': 1, 'MOS_AP_FOcr.Long': 3, 'MOS_ML_FOcr.Larg': 1, 'Weight': 1, 'Main': 1, 'Fctelle': 5, 'MANUALITE': 1, 'Inattention': 1, 'Hyperactivité': 2, 'Pb apprentissage': 6, 'Agressivité': 1, 'Pb sociaux': 3, 'DSM-IV-TR Impulsivité-Hyperactivité': 1, 'DSM-IV-TR Trouble des conduites': 2, 'DSM-IV-TR Trble oppositionprovocation': 1, 'Anxiete': 1, 'Inhibition': 1, 'Flexibilité': 2, 'Contrôle émotionnel': 1, 'Indice Régulation Comportementale .IRC': 2, 'Initiation': 1, 'Organisation matérielle': 1, 'Indice de méatacognition .IMC': 2, 'Négativité': 2, 'SIM': 2}
Nous avons détecter d'outliers pour certaines de nos varibles, affichons les via un box plot
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(15, 8))
df_numeric.boxplot(rot=50) # Rotation des noms des variables pour lisibilité
plt.title("Boxplot des variables numériques (détection des outliers)")
plt.show()
from sklearn.impute import KNNImputer
# Appliquer KNN Imputer
knn_imputer = KNNImputer(n_neighbors=5, weights='uniform') # K=5, peut être ajusté
df_imputed = pd.DataFrame(knn_imputer.fit_transform(df_numeric), columns=df_numeric.columns)
# Remettre les colonnes non numériques dans le DataFrame final
df_final_corrected = df_final.copy()
df_final_corrected[df_numeric.columns] = df_imputed
# Vérifier si les valeurs aberrantes ont été remplacées
print("\n✅ Aperçu des données après correction des outliers avec KNN Imputer :")
print(df_final_corrected.head())
✅ Aperçu des données après correction des outliers avec KNN Imputer : GROUPE Sujet Group AGE CLASSE Age Sexe TAju.ms TExe.ms TPas.ms \ 0 TD TD1 10-11y CM2 10.90 2.0 517.0 475.0 992.0 1 TD TD2 8-9y CM1 9.20 1.0 465.0 389.0 854.0 2 TD TD3 10-11y CM2 10.10 2.0 545.0 541.0 1086.0 3 TD TD4 10-11y CM2 10.05 1.0 471.0 201.0 672.0 4 TD TD5 6-7y CE1 6.10 1.0 444.0 201.0 645.0 TLoad.ms ... MDT Planification Organisation Organisation matérielle \ 0 366.0 ... 56.0 73.0 51.8 1 245.0 ... 44.0 49.0 47.0 2 215.0 ... 41.0 38.0 66.0 3 273.0 ... 60.0 60.0 48.0 4 226.0 ... 53.0 44.0 57.0 Contrôle Indice de méatacognition .IMC CEG = IRC+IMC Négativité \ 0 51.0 63.0 60.0 0.0 1 48.0 45.0 44.0 0.0 2 48.0 45.0 45.0 1.0 3 51.0 59.0 55.0 0.0 4 52.0 71.0 55.0 1.0 Incohérence SIM MAT 0 4.0 14.0 7.0 1 2.0 11.0 8.0 2 4.0 12.0 8.0 3 1.0 11.0 8.0 4 7.0 11.6 9.0 [5 rows x 64 columns]
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(15, 8))
df_imputed.boxplot(rot=70) # Rotation des noms des variables pour lisibilité
plt.title("Boxplot des variables numériques (après imputation des outliers)")
plt.show()
On constate qu'il y a plusieurs enfants avec des caractéristiques atypiques. On peut expliquer certains comme l'enfant le plus lourd (49,8) est également le plus élancé (157).
Donc on laissera les valeurs extremes telles qu'elles sont, puis nous chercherons à expliques ces valeurs extrèmes dans notre rapport.
Mais une d'entre elles semble aberrantes, c'est au niveau du sujet TD19, pour la variable TUnload.ms. Cette variable est une durée alors qu'on y observe une valeur négative : -168.
2.3 Analyse descriptive¶
Nous allons nous focalier sur les variables qui caractérisent l’initiation de la marche at aux données anthropométriques
# Sélectionner les colonnes 1 à 21 et 24 à 31
df_new = df_final_corrected.iloc[:, list(range(23)) + list(range(24, 32))] # .iloc utilise les indices des colonnes
# Supprimer les colonnes "Group AGE" et "CLASSE"
df_new = df_new.drop(columns=["Group AGE", "CLASSE"])
# Vérifier la structure du nouveau dataframe
print(df_new.info())
# Afficher les premières lignes pour vérification
df_new.head()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 30 entries, 0 to 29 Data columns (total 29 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 GROUPE 30 non-null object 1 Sujet 30 non-null object 2 Age 30 non-null float64 3 Sexe 30 non-null float64 4 TAju.ms 30 non-null float64 5 TExe.ms 30 non-null float64 6 TPas.ms 30 non-null float64 7 TLoad.ms 30 non-null float64 8 TUnload.ms 30 non-null float64 9 CoP_tot_AP.Long 30 non-null float64 10 CoP_tot_ML.Larg 30 non-null float64 11 CoP_loadAP.Long 30 non-null float64 12 CoP_load_ML.Larg 30 non-null float64 13 CoP_unload_ML.Larg 30 non-null float64 14 Vpic_load_AP.ms 30 non-null float64 15 Vpic_load_ML.ms 30 non-null float64 16 Vpic_unload_ML.ms 30 non-null float64 17 BOS_AP_Init.m 30 non-null float64 18 BOS_ML_Init.m 30 non-null float64 19 MOS_AP_FOcr.Long 30 non-null float64 20 MOS_ML_FOcr.Larg 30 non-null float64 21 Weight 30 non-null float64 22 Height 30 non-null float64 23 Epaule 30 non-null float64 24 Coude 30 non-null float64 25 Poignet 30 non-null float64 26 Main 30 non-null float64 27 MID 30 non-null float64 28 MIG 30 non-null float64 dtypes: float64(27), object(2) memory usage: 6.9+ KB None
| GROUPE | Sujet | Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | ... | MOS_AP_FOcr.Long | MOS_ML_FOcr.Larg | Weight | Height | Epaule | Coude | Poignet | Main | MID | MIG | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TD | TD1 | 10.90 | 2.0 | 517.0 | 475.0 | 992.0 | 366.0 | 151.0 | 0.032708 | ... | -0.769317 | -0.019617 | 25.3 | 131.0 | 75.0 | 57.0 | 49.0 | 25.0 | 63.0 | 63.0 |
| 1 | TD | TD2 | 9.20 | 1.0 | 465.0 | 389.0 | 854.0 | 245.0 | 220.0 | 0.069070 | ... | -0.587606 | -0.046824 | 33.0 | 136.0 | 87.0 | 70.0 | 50.0 | 23.0 | 70.0 | 70.0 |
| 2 | TD | TD3 | 10.10 | 2.0 | 545.0 | 541.0 | 1086.0 | 215.0 | 330.0 | 0.034305 | ... | -0.682419 | 0.085539 | 30.6 | 138.0 | 82.0 | 57.0 | 45.0 | 26.0 | 72.5 | 72.0 |
| 3 | TD | TD4 | 10.05 | 1.0 | 471.0 | 201.0 | 672.0 | 273.0 | 198.0 | 0.014398 | ... | -0.906076 | -0.110997 | 31.5 | 134.0 | 70.0 | 57.0 | 44.0 | 20.0 | 71.0 | 71.0 |
| 4 | TD | TD5 | 6.10 | 1.0 | 444.0 | 201.0 | 645.0 | 226.0 | 218.0 | 0.051200 | ... | -0.914220 | -0.143763 | 29.0 | 130.0 | 82.0 | 64.0 | 51.0 | 29.0 | 64.0 | 64.0 |
5 rows × 29 columns
df_new.describe()
| Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | CoP_tot_ML.Larg | CoP_loadAP.Long | ... | MOS_AP_FOcr.Long | MOS_ML_FOcr.Larg | Weight | Height | Epaule | Coude | Poignet | Main | MID | MIG | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | ... | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.000000 | 30.00000 | 30.00000 |
| mean | 8.609333 | 1.566667 | 505.240000 | 288.200000 | 791.066667 | 280.106667 | 213.666667 | 0.039968 | 0.113465 | 0.195808 | ... | -0.854219 | -0.069800 | 29.037000 | 134.733333 | 72.133333 | 56.900000 | 47.333333 | 23.533333 | 67.60000 | 67.45000 |
| std | 1.714623 | 0.504007 | 55.194338 | 109.350875 | 148.198360 | 65.573664 | 78.331010 | 0.012413 | 0.021794 | 0.079954 | ... | 0.155933 | 0.069196 | 6.482568 | 10.578714 | 14.048520 | 7.774184 | 4.261563 | 2.825174 | 7.69505 | 7.76081 |
| min | 6.000000 | 1.000000 | 420.000000 | 201.000000 | 474.000000 | 137.000000 | 75.000000 | 0.014398 | 0.073276 | -0.005183 | ... | -1.184755 | -0.215196 | 19.300000 | 116.500000 | 53.000000 | 44.000000 | 39.000000 | 18.000000 | 57.00000 | 57.00000 |
| 25% | 7.137500 | 1.000000 | 455.000000 | 201.000000 | 673.750000 | 235.250000 | 153.750000 | 0.032430 | 0.098253 | 0.120784 | ... | -0.954376 | -0.113639 | 24.150000 | 128.000000 | 61.000000 | 51.000000 | 44.000000 | 22.000000 | 62.00000 | 62.00000 |
| 50% | 8.350000 | 2.000000 | 507.500000 | 216.500000 | 752.000000 | 281.000000 | 203.000000 | 0.037639 | 0.111075 | 0.224284 | ... | -0.866500 | -0.060387 | 29.000000 | 133.500000 | 70.000000 | 56.500000 | 47.000000 | 23.000000 | 66.00000 | 65.50000 |
| 75% | 10.177500 | 2.000000 | 543.250000 | 392.750000 | 889.250000 | 320.600000 | 262.250000 | 0.047277 | 0.130610 | 0.260647 | ... | -0.764637 | -0.026904 | 33.000000 | 140.250000 | 82.000000 | 62.750000 | 50.000000 | 25.000000 | 72.12500 | 71.75000 |
| max | 11.080000 | 2.000000 | 635.000000 | 541.000000 | 1086.000000 | 404.000000 | 363.000000 | 0.069070 | 0.156527 | 0.304639 | ... | -0.453764 | 0.085539 | 45.000000 | 157.000000 | 99.000000 | 70.000000 | 58.000000 | 29.000000 | 84.00000 | 84.00000 |
8 rows × 27 columns
Passons à l'exploration proprement dite de nos données
import pandas as pd
import numpy as np
def create_demographic_table(df):
# Création du tableau démographique par sexe
demographic_stats = df.groupby('Sexe').agg({
'Age': ['count', 'mean', 'std'],
'Height': 'mean',
'Weight': 'mean'
})
# Formatage du tableau
demographic_stats.columns = ['N', 'Age_mean', 'Age_std', 'Height', 'Weight']
demographic_stats['Age'] = demographic_stats.apply(
lambda x: f"{x['Age_mean']:.1f} ± {x['Age_std']:.1f}", axis=1)
# Renommage des index
demographic_stats.index = ['Garçons', 'Filles']
return demographic_stats[['N', 'Age', 'Height', 'Weight']]
def create_temporal_table(df):
# Paramètres temporels
temporal_params = ['TAju.ms', 'TExe.ms', 'TPas.ms']
# Calcul des statistiques
temporal_stats = df[temporal_params].agg(['mean', 'std', 'min', 'max'])
# Reformater le tableau pour avoir les paramètres en ligne et les stats en colonnes
temporal_stats = temporal_stats.T # Transposer pour mettre les variables en lignes
# Renommer les index avec des noms plus compréhensibles
temporal_stats.index = ["Temps d'ajustement (ms)", "Temps d'exécution (ms)", "Temps de pas (ms)"]
return temporal_stats
def create_postural_table(df):
# Paramètres posturaux
postural_params = ['CoP_tot_AP.Long', 'CoP_tot_ML.Larg',
'BOS_AP_Init.m', 'BOS_ML_Init.m']
# Calcul des statistiques
postural_stats = df[postural_params].agg(['mean', 'std', 'min', 'max'])
# Reformater le tableau pour avoir les paramètres en ligne et les stats en colonnes
postural_stats = postural_stats.T # Transposer pour mettre les variables en lignes
# Formatage du tableau
postural_stats.index = ['CoP AP (mm)', 'CoP ML (mm)',
'Base de support AP (m)',
'Base de support ML (m)']
return postural_stats
# Lecture des données
df = df_new
# Création des tableaux
demographic_table = create_demographic_table(df)
temporal_table = create_temporal_table(df)
postural_table = create_postural_table(df)
# Affichage des tableaux
print("Tableau 1 : Caractéristiques démographiques par sexe")
print(demographic_table.to_string())
Tableau 1 : Caractéristiques démographiques par sexe
N Age Height Weight
Garçons 13 8.5 ± 1.7 134.423077 29.203846
Filles 17 8.7 ± 1.8 134.970588 29.947059
Ce tableau présente les caractéristiques démographiques des participants, réparties par sexe. On observe que l'échantillon est composé de 13 garçons et 17 filles, soit un total de 30 participants.
L'âge moyen des participants est de 8,6 ans, avec un écart-type de 1,7 ans. Il n'y a pas de différence notable d'âge moyen entre les garçons (8,5 ans) et les filles (8,7 ans), et la variabilité de l'âge est similaire dans les deux groupes.
La taille moyenne des participants est de 134,7 cm. Les filles sont légèrement plus grandes en moyenne (134,97 cm) que les garçons (134,42 cm), mais cette différence est minime.
Le poids moyen des participants est de 29,6 kg. Les filles pèsent en moyenne un peu plus lourd (29,95 kg) que les garçons (29,20 kg), mais là encore, la différence n'est pas très importante.
# prompt: pie chart 3D with demographic_table['N']
import matplotlib.pyplot as plt
# Assuming demographic_table is already created as in your provided code
# Create the pie chart
plt.figure(figsize=(8, 8)) # Adjust figure size as needed
plt.pie(demographic_table['N'], labels=demographic_table.index, autopct='%1.1f%%', startangle=90, explode=[0.1, 0]) # Add explode for better visualization
# Add a title
plt.title('Distribution Démographique par Genre')
# Display the chart
plt.show()
print("\nTableau 2 : Paramètres temporels de l'initiation à la marche")
print(temporal_table.to_string())
Tableau 2 : Paramètres temporels de l'initiation à la marche
mean std min max
Temps d'ajustement (ms) 502.866667 97.402731 273.0 827.0
Temps d'exécution (ms) 288.200000 109.350875 201.0 541.0
Temps de pas (ms) 791.066667 148.198360 474.0 1086.0
Ce tableau révèle les aspects temporels de l'initiation à la marche.
On observe que le temps d'ajustement, nécessaire à la préparation du mouvement, est en moyenne de 503 ms, avec une variabilité de 97 ms.
Le temps d'exécution du pas est plus court (288 ms en moyenne), mais sa variabilité est plus importante (109 ms).
Enfin, le temps de pas, qui correspond à la durée entre deux contacts du talon avec le sol, est le plus long (791 ms en moyenne) et présente également une variabilité substantielle (148 ms).
Ces données suggèrent que l'initiation à la marche chez les enfants implique une phase de préparation notable, suivie d'une exécution rapide du pas et d'un cycle de pas globalement plus long et variable.
print("\nTableau 3 : Paramètres posturaux")
print(postural_table.to_string())
Tableau 3 : Paramètres posturaux
mean std min max
CoP AP (mm) 0.041073 0.013806 0.014398 0.073069
CoP ML (mm) 0.113465 0.021794 0.073276 0.156527
Base de support AP (m) 0.171151 0.015024 0.147411 0.203916
Base de support ML (m) 0.239107 0.024914 0.193978 0.289123
Ce tableau décrit la posture des enfants lors de l'initiation à la marche.
On constate que le centre de pression (CoP), qui reflète le point d'application de la force au sol, est légèrement décalé vers l'avant (0,041 mm) et latéralement (0,113 mm). La base de support, qui correspond à la surface délimitée par les pieds, mesure en moyenne 0,171 m dans le sens antéro-postérieur et 0,239 m dans le sens médio-latéral.
Ces informations indiquent que les enfants adoptent une posture légèrement penchée vers l'avant et avec une base de support relativement large, ce qui peut contribuer à leur stabilité lors des premiers pas.
Ensuite, faisons quelques graphiques
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# Configuration du style des graphiques
sns.set_theme(style="darkgrid")
sns.set_palette("husl")
# 1. Graphique des temps de marche
def plot_walking_times():
# Sélection des 10 premiers sujets pour la lisibilité
df_subset = df.head(10)
# Création de la figure
plt.figure(figsize=(12, 6))
# Positions des barres
x = np.arange(len(df_subset))
width = 0.25
# Création des barres pour chaque mesure de temps
plt.bar(x - width, df_subset['TAju.ms'], width, label='Temps d\'ajustement')
plt.bar(x, df_subset['TExe.ms'], width, label='Temps d\'exécution')
plt.bar(x + width, df_subset['TPas.ms'], width, label='Temps de pas')
# Personnalisation du graphique
plt.xlabel('Sujets')
plt.ylabel('Temps (ms)')
plt.title('Distribution des temps de marche par sujet')
plt.xticks(x, df_subset['Sujet'], rotation=45)
plt.legend()
plt.tight_layout()
# Affichage
plt.show()
# 2. Graphique Age vs Centre de Pression (CoP)
def plot_age_vs_cop():
# Création de la figure
fig, ax = plt.subplots(figsize=(12, 6))
# Tracé des données
scatter1 = ax.scatter(df['Age'], df['CoP_tot_AP.Long'],
label='CoP Antéro-Postérieur', alpha=0.6)
scatter2 = ax.scatter(df['Age'], df['CoP_tot_ML.Larg'],
label='CoP Médio-Latéral', alpha=0.6)
# Ajout des lignes de régression
z1 = np.polyfit(df['Age'], df['CoP_tot_AP.Long'], 1)
p1 = np.poly1d(z1)
z2 = np.polyfit(df['Age'], df['CoP_tot_ML.Larg'], 1)
p2 = np.poly1d(z2)
ax.plot(df['Age'], p1(df['Age']), "--", color=scatter1.get_facecolor()[0])
ax.plot(df['Age'], p2(df['Age']), "--", color=scatter2.get_facecolor()[0])
# Personnalisation du graphique
ax.set_xlabel('Âge (années)')
ax.set_ylabel('Centre de Pression (mm)')
ax.set_title('Relation entre l\'âge et le Centre de Pression')
ax.legend()
plt.tight_layout()
# Affichage
plt.show()
# 3. Analyse statistique descriptive
def print_descriptive_stats():
# Statistiques descriptives des paramètres temporels
temps_stats = df[['TAju.ms', 'TExe.ms', 'TPas.ms']].describe()
print("\nStatistiques descriptives des paramètres temporels :")
print(temps_stats)
# Statistiques descriptives du CoP
cop_stats = df[['CoP_tot_AP.Long', 'CoP_tot_ML.Larg']].describe()
print("\nStatistiques descriptives du Centre de Pression :")
print(cop_stats)
# Corrélations
corr_matrix = df[['Age', 'TAju.ms', 'TExe.ms', 'TPas.ms',
'CoP_tot_AP.Long', 'CoP_tot_ML.Larg']].corr()
print("\nMatrice de corrélation :")
print(corr_matrix)
# Bonus : Visualisation des corrélations
def plot_correlation_matrix():
# Sélection des variables d'intérêt
variables = ['Age', 'TAju.ms', 'TExe.ms', 'TPas.ms',
'CoP_tot_AP.Long', 'CoP_tot_ML.Larg']
corr_matrix = df[variables].corr()
# Création de la figure
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0,
fmt='.2f', square=True)
plt.title('Matrice de corrélation des paramètres de marche')
plt.tight_layout()
plt.show()
# Exécution des fonctions
if __name__ == "__main__":
plot_walking_times()
plot_age_vs_cop()
print_descriptive_stats()
plot_correlation_matrix()
Statistiques descriptives des paramètres temporels :
TAju.ms TExe.ms TPas.ms
count 30.000000 30.000000 30.000000
mean 502.866667 288.200000 791.066667
std 97.402731 109.350875 148.198360
min 273.000000 201.000000 474.000000
25% 455.000000 201.000000 673.750000
50% 507.500000 216.500000 752.000000
75% 543.250000 392.750000 889.250000
max 827.000000 541.000000 1086.000000
Statistiques descriptives du Centre de Pression :
CoP_tot_AP.Long CoP_tot_ML.Larg
count 30.000000 30.000000
mean 0.041073 0.113465
std 0.013806 0.021794
min 0.014398 0.073276
25% 0.032430 0.098253
50% 0.037639 0.111075
75% 0.048384 0.130610
max 0.073069 0.156527
Matrice de corrélation :
Age TAju.ms TExe.ms TPas.ms CoP_tot_AP.Long \
Age 1.000000 0.011044 0.029349 0.028914 0.213706
TAju.ms 0.011044 1.000000 0.024310 0.675183 -0.096264
TExe.ms 0.029349 0.024310 1.000000 0.753846 -0.259932
TPas.ms 0.028914 0.675183 0.753846 1.000000 -0.255065
CoP_tot_AP.Long 0.213706 -0.096264 -0.259932 -0.255065 1.000000
CoP_tot_ML.Larg 0.210177 0.237036 -0.253940 -0.031583 0.248957
CoP_tot_ML.Larg
Age 0.210177
TAju.ms 0.237036
TExe.ms -0.253940
TPas.ms -0.031583
CoP_tot_AP.Long 0.248957
CoP_tot_ML.Larg 1.000000
Maintenant, visualisons la distribution des âges et la relation entre l'âge et l'une des mesures de performance, comme « TAju.ms ».
Je vais créer des histogrammes et des nuages de points pour ces analyses. Continuons avec ça.
# Setting up the visualizations
plt.figure(figsize=(14, 6))
# Histogram of Age
plt.subplot(1, 2, 1)
sns.histplot(df['Age'], bins=10, kde=True)
plt.title('Distribution of Age')
plt.xlabel('Age')
plt.ylabel('Frequency')
# Scatter plot of Age vs TAju.ms
plt.subplot(1, 2, 2)
sns.scatterplot(x='Age', y='TAju.ms', data=df)
plt.title('Age vs TAju.ms')
plt.xlabel('Age')
plt.ylabel('TAju.ms')
plt.tight_layout()
plt.show()
Les visualisations montrent la distribution des âges et la relation entre l'âge et la mesure de performance « TAju.ms ».
L'histogramme indique la répartition des âges dans l'ensemble de données, tandis que le nuage de points permet d'identifier toute corrélation entre l'âge et « TAju.ms ».
Ensuite, nous explorerons d'autres relations dans les données, telles que la distribution du « sexe » et son impact sur d'autres mesures de performance. Nous créerons un graphique de comptage pour le « sexe » et des graphiques en boîte pour comparer les « TAju.ms » entre les différents sexes. Continuons cette analyse.
# Setting up the next visualizations
plt.figure(figsize=(14, 6))
# Count plot for Sexe
plt.subplot(1, 2, 1)
sns.countplot(x='Sexe', hue="Sexe",data=df)
plt.title('Count of Sexe')
plt.xlabel('Sexe')
plt.ylabel('Count')
# Box plot of TAju.ms by Sexe
plt.subplot(1, 2, 2)
sns.boxplot(x='Sexe', y='TAju.ms',hue="Sexe", data=df)
plt.title('TAju.ms by Sexe')
plt.xlabel('Sexe')
plt.ylabel('TAju.ms')
plt.tight_layout()
plt.show()
Les visualisations montrent le nombre d'individus par « sexe » et la distribution de « TAju.ms » entre les différents sexes.
Le graphique de comptage indique le nombre de garçons et de filles dans l'ensemble de données, tandis que le graphique en boîte révèle comment « TAju.ms » varie entre les sexes, mettant en évidence les différences potentielles de performance.
Ensuite, nous explorerons des mesures de performance supplémentaires, telles que « TExe.ms » et « TPas.ms », pour voir comment elles se rapportent à l'âge et au sexe. Nous créerons des diagrammes de dispersion pour ces mesures par rapport à l'âge et des graphiques en boîte pour les comparer par sexe. Continuons cette analyse.
# Setting up the next visualizations for TExe.ms and TPas.ms
plt.figure(figsize=(14, 12))
# Scatter plot of Age vs TExe.ms
plt.subplot(2, 2, 1)
sns.scatterplot(x='Age', y='TExe.ms', data=df)
plt.title('Age vs TExe.ms')
plt.xlabel('Age')
plt.ylabel('TExe.ms')
# Box plot of TExe.ms by Sexe
plt.subplot(2, 2, 2)
sns.boxplot(x='Sexe', y='TExe.ms',hue="Sexe", data=df)
plt.title('TExe.ms by Sexe')
plt.xlabel('Sexe')
plt.ylabel('TExe.ms')
# Scatter plot of Age vs TPas.ms
plt.subplot(2, 2, 3)
sns.scatterplot(x='Age', y='TPas.ms', data=df)
plt.title('Age vs TPas.ms')
plt.xlabel('Age')
plt.ylabel('TPas.ms')
# Box plot of TPas.ms by Sexe
plt.subplot(2, 2, 4)
sns.boxplot(x='Sexe', y='TPas.ms',hue="Sexe", data=df)
plt.title('TPas.ms by Sexe')
plt.xlabel('Sexe')
plt.ylabel('TPas.ms')
plt.tight_layout()
plt.show()
Les visualisations illustrent les relations entre l'âge et les indicateurs de performance « TExe.ms » et « TPas.ms », ainsi que leurs distributions selon le sexe. Les diagrammes de dispersion aident à identifier les tendances, tandis que les diagrammes en boîte donnent un aperçu des différences dans les indicateurs de performance entre les hommes et les femmes.
Ensuite, nous analyserons les corrélations entre les différents indicateurs de performance pour comprendre comment ils sont liés les uns aux autres. Nous créerons une carte thermique de corrélation pour visualiser ces relations. Continuons avec cette analyse.
# Filtering the numeric columns for correlation analysis
numeric_df = df.select_dtypes(include=['float64', 'int64'])
# Calculating the correlation matrix
correlation_matrix = numeric_df.corr()
# Setting up the heatmap
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=False, fmt='.2f', cmap='coolwarm', square=True, cbar_kws={'shrink': .8})
plt.title('Correlation Heatmap of Performance Metrics')
plt.show()
La carte thermique de corrélation a été générée avec succès, affichant les relations entre les mesures de performance numériques. Cette visualisation nous permet d'identifier les mesures fortement corrélées entre elles, ce qui peut éclairer une analyse ou une modélisation plus approfondie. Ensuite, je résumerai les principales conclusions de la carte thermique et explorerai toutes les relations spécifiques qui pourraient justifier une enquête plus approfondie. S'il existe des mesures ou des relations particulières, vous aimeriez
correlation_matrix
| Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | CoP_tot_ML.Larg | CoP_loadAP.Long | ... | MOS_AP_FOcr.Long | MOS_ML_FOcr.Larg | Weight | Height | Epaule | Coude | Poignet | Main | MID | MIG | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Age | 1.000000 | 0.063498 | 0.011044 | 0.029349 | 0.028914 | -0.112533 | 0.129448 | 0.213706 | 0.210177 | 0.134787 | ... | -0.005848 | 0.172981 | 0.648591 | 0.794803 | 0.333151 | 0.291046 | 0.432212 | 0.262119 | 0.749922 | 0.754120 |
| Sexe | 0.063498 | 1.000000 | -0.020885 | 0.389540 | 0.273703 | 0.007305 | -0.033482 | -0.227671 | -0.137990 | -0.101708 | ... | -0.035236 | 0.036994 | 0.049969 | 0.026085 | -0.186361 | -0.213854 | -0.107030 | 0.064704 | 0.024895 | 0.020717 |
| TAju.ms | 0.011044 | -0.020885 | 1.000000 | 0.024310 | 0.675183 | 0.627070 | 0.598670 | -0.096264 | 0.237036 | -0.081245 | ... | -0.104681 | 0.057249 | 0.027769 | 0.138294 | 0.000517 | 0.085411 | -0.177002 | -0.046151 | 0.212546 | 0.203282 |
| TExe.ms | 0.029349 | 0.389540 | 0.024310 | 1.000000 | 0.753846 | 0.112423 | -0.085374 | -0.259932 | -0.253940 | -0.117716 | ... | 0.459436 | 0.377609 | 0.067549 | -0.097934 | 0.384514 | 0.250376 | 0.008510 | 0.136956 | -0.123804 | -0.143684 |
| TPas.ms | 0.028914 | 0.273703 | 0.675183 | 0.753846 | 1.000000 | 0.495092 | 0.330478 | -0.255065 | -0.031583 | -0.140257 | ... | 0.270202 | 0.316252 | 0.068093 | 0.018631 | 0.284060 | 0.240881 | -0.110055 | 0.070723 | 0.048344 | 0.027586 |
| TLoad.ms | -0.112533 | 0.007305 | 0.627070 | 0.112423 | 0.495092 | 1.000000 | -0.248539 | -0.224985 | 0.032482 | 0.125085 | ... | -0.102423 | 0.136997 | -0.184005 | -0.085568 | -0.077153 | 0.050200 | -0.242707 | -0.078828 | -0.075390 | -0.082011 |
| TUnload.ms | 0.129448 | -0.033482 | 0.598670 | -0.085374 | 0.330478 | -0.248539 | 1.000000 | 0.111647 | 0.261348 | -0.229649 | ... | -0.024849 | -0.069685 | 0.223740 | 0.259953 | 0.079979 | 0.054587 | 0.029475 | 0.023670 | 0.341818 | 0.337106 |
| CoP_tot_AP.Long | 0.213706 | -0.227671 | -0.096264 | -0.259932 | -0.255065 | -0.224985 | 0.111647 | 1.000000 | 0.248957 | 0.633898 | ... | -0.311187 | -0.346935 | 0.274871 | 0.319996 | 0.193154 | 0.191282 | 0.381351 | 0.155789 | 0.352783 | 0.371353 |
| CoP_tot_ML.Larg | 0.210177 | -0.137990 | 0.237036 | -0.253940 | -0.031583 | 0.032482 | 0.261348 | 0.248957 | 1.000000 | 0.179794 | ... | -0.123429 | -0.284412 | 0.523828 | 0.560383 | 0.317122 | 0.199539 | 0.334166 | 0.059304 | 0.507786 | 0.514644 |
| CoP_loadAP.Long | 0.134787 | -0.101708 | -0.081245 | -0.117716 | -0.140257 | 0.125085 | -0.229649 | 0.633898 | 0.179794 | 1.000000 | ... | -0.468985 | -0.139387 | 0.215175 | 0.236748 | 0.309317 | 0.384767 | 0.320710 | 0.199306 | 0.169640 | 0.181703 |
| CoP_load_ML.Larg | 0.347639 | -0.201847 | 0.167691 | -0.216519 | -0.049548 | 0.228846 | -0.026799 | 0.337423 | 0.659826 | 0.479280 | ... | -0.144091 | 0.128256 | 0.480334 | 0.506703 | 0.438067 | 0.387757 | 0.342866 | 0.222173 | 0.499993 | 0.508010 |
| CoP_unload_ML.Larg | 0.058754 | 0.040619 | 0.276699 | -0.271914 | -0.018777 | -0.041995 | 0.387252 | 0.108798 | 0.595402 | -0.125436 | ... | -0.163713 | -0.578190 | 0.125206 | 0.257260 | -0.098126 | -0.220148 | 0.033815 | -0.138605 | 0.192260 | 0.197202 |
| Vpic_load_AP.ms | 0.411568 | -0.228411 | -0.207396 | -0.181661 | -0.270352 | -0.157398 | -0.096041 | 0.628571 | 0.386659 | 0.784455 | ... | -0.276617 | -0.221167 | 0.444601 | 0.465429 | 0.467503 | 0.415330 | 0.577151 | 0.249944 | 0.323109 | 0.342437 |
| Vpic_load_ML.ms | 0.321339 | -0.114034 | -0.019307 | -0.239185 | -0.189176 | -0.008860 | -0.014896 | 0.423050 | 0.608232 | 0.553975 | ... | -0.134461 | 0.001252 | 0.537496 | 0.592737 | 0.339165 | 0.342577 | 0.424116 | 0.253251 | 0.600104 | 0.599017 |
| Vpic_unload_ML.ms | -0.037359 | -0.221397 | -0.132228 | -0.030353 | -0.109303 | 0.397048 | -0.572700 | -0.120981 | 0.280752 | -0.011744 | ... | 0.147037 | 0.064203 | -0.102777 | -0.020423 | -0.097187 | -0.188247 | -0.202074 | -0.291185 | -0.001079 | 0.007103 |
| BOS_AP_Init.m | 0.715142 | 0.084120 | 0.076362 | 0.024275 | 0.068100 | -0.120702 | 0.219071 | 0.353622 | 0.393082 | 0.317790 | ... | 0.091462 | 0.023844 | 0.845679 | 0.884395 | 0.399610 | 0.474045 | 0.635343 | 0.503196 | 0.844139 | 0.835927 |
| BOS_ML_Init.m | -0.054450 | -0.090116 | -0.095760 | 0.057009 | -0.020873 | -0.169127 | 0.054835 | -0.024825 | 0.460813 | -0.042940 | ... | 0.089436 | -0.035938 | 0.300190 | 0.186107 | 0.215846 | 0.203909 | 0.190054 | 0.012172 | 0.163641 | 0.165291 |
| MOS_AP_FOcr.Long | -0.005848 | -0.035236 | -0.104681 | 0.459436 | 0.270202 | -0.102423 | -0.024849 | -0.311187 | -0.123429 | -0.468985 | ... | 1.000000 | 0.308709 | 0.033022 | -0.033244 | 0.172967 | 0.098496 | 0.071063 | 0.151247 | -0.011065 | -0.026736 |
| MOS_ML_FOcr.Larg | 0.172981 | 0.036994 | 0.057249 | 0.377609 | 0.316252 | 0.136997 | -0.069685 | -0.346935 | -0.284412 | -0.139387 | ... | 0.308709 | 1.000000 | 0.149291 | 0.009685 | 0.200844 | 0.219487 | 0.075887 | 0.056847 | 0.090251 | 0.069749 |
| Weight | 0.648591 | 0.049969 | 0.027769 | 0.067549 | 0.068093 | -0.184005 | 0.223740 | 0.274871 | 0.523828 | 0.215175 | ... | 0.033022 | 0.149291 | 1.000000 | 0.871518 | 0.607289 | 0.567627 | 0.746298 | 0.527497 | 0.819555 | 0.810543 |
| Height | 0.794803 | 0.026085 | 0.138294 | -0.097934 | 0.018631 | -0.085568 | 0.259953 | 0.319996 | 0.560383 | 0.236748 | ... | -0.033244 | 0.009685 | 0.871518 | 1.000000 | 0.408847 | 0.370317 | 0.573797 | 0.356038 | 0.946877 | 0.948640 |
| Epaule | 0.333151 | -0.186361 | 0.000517 | 0.384514 | 0.284060 | -0.077153 | 0.079979 | 0.193154 | 0.317122 | 0.309317 | ... | 0.172967 | 0.200844 | 0.607289 | 0.408847 | 1.000000 | 0.846284 | 0.663905 | 0.611058 | 0.293491 | 0.285976 |
| Coude | 0.291046 | -0.213854 | 0.085411 | 0.250376 | 0.240881 | 0.050200 | 0.054587 | 0.191282 | 0.199539 | 0.384767 | ... | 0.098496 | 0.219487 | 0.567627 | 0.370317 | 0.846284 | 1.000000 | 0.589108 | 0.680551 | 0.302215 | 0.289395 |
| Poignet | 0.432212 | -0.107030 | -0.177002 | 0.008510 | -0.110055 | -0.242707 | 0.029475 | 0.381351 | 0.334166 | 0.320710 | ... | 0.071063 | 0.075887 | 0.746298 | 0.573797 | 0.663905 | 0.589108 | 1.000000 | 0.563184 | 0.460570 | 0.453540 |
| Main | 0.262119 | 0.064704 | -0.046151 | 0.136956 | 0.070723 | -0.078828 | 0.023670 | 0.155789 | 0.059304 | 0.199306 | ... | 0.151247 | 0.056847 | 0.527497 | 0.356038 | 0.611058 | 0.680551 | 0.563184 | 1.000000 | 0.304562 | 0.294120 |
| MID | 0.749922 | 0.024895 | 0.212546 | -0.123804 | 0.048344 | -0.075390 | 0.341818 | 0.352783 | 0.507786 | 0.169640 | ... | -0.011065 | 0.090251 | 0.819555 | 0.946877 | 0.293491 | 0.302215 | 0.460570 | 0.304562 | 1.000000 | 0.998571 |
| MIG | 0.754120 | 0.020717 | 0.203282 | -0.143684 | 0.027586 | -0.082011 | 0.337106 | 0.371353 | 0.514644 | 0.181703 | ... | -0.026736 | 0.069749 | 0.810543 | 0.948640 | 0.285976 | 0.289395 | 0.453540 | 0.294120 | 0.998571 | 1.000000 |
27 rows × 27 columns
Autres graphes
# Initialisation du graphique
plt.figure(figsize=(12, 6))
# Création du scatter plot
sns.scatterplot(x="Sujet", y="TAju.ms", hue="Sexe", data=df, palette={1: "blue", 2: "red"})
# Ajout d'une ligne représentant la moyenne
plt.axhline(y=df["TAju.ms"].mean(), color="green", linestyle="-")
# Rotation des labels en abscisse pour améliorer la lisibilité
plt.xticks(rotation=45)
# Ajout des titres et labels
plt.title("Nuage de points: Distribution de la durée d'ajustement")
plt.xlabel("Sujet")
plt.ylabel("TAju.ms")
# Affichage de la légende
plt.legend(title="Sexe")
# Affichage du graphe
plt.show()
Graphe Age et vitesse de pas
# Initialisation du graphique
plt.figure(figsize=(8, 6))
# Création du scatter plot
sns.scatterplot(x="Age", y="Vpic_load_AP.ms", data=df, color="black")
# Ajout d'une ligne de tendance (moyenne mobile)
sns.regplot(x="Age", y="Vpic_load_AP.ms", data=df, scatter=False, color="blue", lowess=True)
# Ajout des titres et labels
plt.title("Vitesse du Pas en Fonction de l'Âge")
plt.xlabel("Âge (années)")
plt.ylabel("Vitesse du Pas (m/s)")
# Affichage du graphe
plt.show()
On peut dire que malgré certains cas;on observe une correlation positive entre l’age et la vitesse du pas; ce qui est évident car de plus on grandit; de plus la vitesse du pas doit augmente jusqu’à ne plus s’en rendre compte de tous ces nombreux mécanismes que nécessite la marche. On peut étudier la distribution des durées des phases(chargement et déchargement) en fonction du sexe
# Filtering the data for Sexe 1 and 2
filtered_data = df[df['Sexe'].isin([1, 2])]
# Calculating mean durations for TLoad.ms and TUnload.ms by Sexe
mean_durations = filtered_data.groupby('Sexe')[['TLoad.ms', 'TUnload.ms']].mean().reset_index()
# Melting the dataframe for easier plotting
mean_durations_melted = mean_durations.melt(id_vars='Sexe', value_vars=['TLoad.ms', 'TUnload.ms'], var_name='Phase', value_name='Mean Duration (ms)')
# Creating a clustered bar graph
plt.figure(figsize=(10, 6))
sns.barplot(data=mean_durations_melted, x='Phase', y='Mean Duration (ms)', hue='Sexe')
plt.title('Mean Durations of TLoad.ms and TUnload.ms by Sexe')
plt.xlabel('Phase')
plt.ylabel('Mean Duration (ms)')
plt.legend(title='Sexe')
plt.tight_layout()
# Show the plot
plt.show()
On remarque que la durée de la phase de chargement est distribuée presque uniformément pour les deux sexes alors que pour la phase de déchargement;les enfants de sexe 1 prennent moins de temps pour évaluer et se préparer avant de commencer à marcher.
# Création des subplots pour affichage côte à côte
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# Premier graphique
sns.scatterplot(
x='CoP_tot_AP.Long', y='MOS_AP_FOcr.Long',
size='BOS_AP_Init.m', alpha=0.7, data=df, ax=axes[0]
)
axes[0].set_title("Écart entre le CoM et le CoP en f(x) du CoP")
axes[0].set_xlabel("CoP TOT")
axes[0].set_ylabel("Écart entre")
# Deuxième graphique
sns.scatterplot(
x='CoP_tot_ML.Larg', y='MOS_ML_FOcr.Larg',
size='BOS_ML_Init.m', alpha=0.7, data=df, ax=axes[1]
)
axes[1].set_title("MOD_ML vs CoP_ML")
axes[1].set_xlabel("CoP ML")
axes[1].set_ylabel("MOD ML")
# Ajustement automatique de la légende
plt.tight_layout()
plt.show()
3. Effet de l’âge¶
Analyse des variables pertinentes
a. Nuage de points (Scatterplot)
Objectif : Visualiser la relation entre l'âge et une variable numérique.
# Nuage de points : Âge vs TUnload.ms
plt.figure(figsize=(8, 6))
sns.scatterplot(x='Age', y='BOS_AP_Init.m', data=df)
plt.title("Nuage de points : Âge vs BOS_AP_Init.m ")
plt.xlabel("Âge")
plt.ylabel("BOS_AP_Init (ms)")
plt.show()
/usr/local/lib/python3.11/dist-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 9 ( ) missing from font(s) DejaVu Sans. fig.canvas.print_figure(bytes_io, **kw)
correlation_age = correlation_matrix['Age'].sort_values(ascending=False)
correlation_age
| Age | |
|---|---|
| Age | 1.000000 |
| Height | 0.794803 |
| MIG | 0.754120 |
| MID | 0.749922 |
| BOS_AP_Init.m | 0.715142 |
| Weight | 0.648591 |
| Poignet | 0.432212 |
| Vpic_load_AP.ms | 0.411568 |
| CoP_load_ML.Larg | 0.347639 |
| Epaule | 0.333151 |
| Vpic_load_ML.ms | 0.321339 |
| Coude | 0.291046 |
| Main | 0.262119 |
| CoP_tot_AP.Long | 0.213706 |
| CoP_tot_ML.Larg | 0.210177 |
| MOS_ML_FOcr.Larg | 0.172981 |
| CoP_loadAP.Long | 0.134787 |
| TUnload.ms | 0.129448 |
| Sexe | 0.063498 |
| CoP_unload_ML.Larg | 0.058754 |
| TExe.ms | 0.029349 |
| TPas.ms | 0.028914 |
| TAju.ms | 0.011044 |
| MOS_AP_FOcr.Long | -0.005848 |
| Vpic_unload_ML.ms | -0.037359 |
| BOS_ML_Init.m | -0.054450 |
| TLoad.ms | -0.112533 |
L'âge est plus lié à : Height (0.79), MIG (0.75), MID(0.749), BOS_AP_Init.m(0.71), Weight(0.64)
Faisons donc un pairplot entre l'Age et ces variables
# Sélectionner les colonnes pertinentes
colonnes = ['Age', 'Height', 'MIG', 'MID', 'BOS_AP_Init.m', 'Weight']
sns.pairplot(df[colonnes])
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Sélectionner les colonnes pertinentes
colonnes = ['Age', 'Height', 'MIG', 'MID', 'BOS_AP_Init.m', 'Weight']
df_filtered = df[colonnes + ['Sexe']] # Ajouter la colonne Sexe
# Définir une palette de couleurs pour distinguer les sexes
palette = {1: 'skyblue', 2: 'pink'} # 1 = Garçon, 2 = Fille
# Créer le pairplot avec couleur et régression
pairplot = sns.pairplot(df_filtered, hue="Sexe", palette=palette, diag_kind="kde", kind="reg")
# Ajouter les coefficients de corrélation sur les graphes
for i, j in zip(*np.triu_indices_from(pairplot.axes, k=1)): # Parcourt la moitié supérieure de la matrice
corr = np.corrcoef(df_filtered[colonnes[i]], df_filtered[colonnes[j]])[0, 1]
pairplot.axes[i, j].annotate(f'r = {corr:.2f}', xy=(0.5, 0.9), xycoords='axes fraction', ha='center', fontsize=10, color='black')
plt.show()
# Supprimer les 8 dernières colonnes
df_reduit = df.iloc[:, 2:-8]
numeric_df_r = df_reduit.select_dtypes(include=['float64', 'int64'])
# Calculer la matrice de corrélation
matrix_r = numeric_df_r.corr(method='pearson') # ou 'spearman' si nécessaire
# Visualiser la matrice de corrélation avec heatmap de Seaborn
plt.figure(figsize=(10, 8)) # Ajuster la taille si nécessaire
sns.heatmap(matrix_r, annot=False, cmap='coolwarm', fmt=".2f", linewidths=.5)
plt.title('Matrice de Corrélation')
plt.show()
D’après la matrice de correlation, on constate que la variable “BOS_AP_Init.m” (Base de support_longueur_axe AP) est la plus pertinente par rapport à l’âge Question qu’on se pose alors : Comment l’âge influence-t-il la longuer de la base de support?
Variable groupe d'âge en 2 groupes
# Créer la nouvelle variable "groupe_age2"
def categoriser_age(age):
if 6 <= age <= 8.9:
return "6-8 ans"
elif 9 <= age <= 12:
return "9-11 ans"
else:
return None # Ou une autre catégorie si vous avez d'autres âges
df['groupe_age2'] = df['Age'].apply(categoriser_age)
# Afficher le DataFrame mis à jour
df.head()
| GROUPE | Sujet | Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | ... | MOS_ML_FOcr.Larg | Weight | Height | Epaule | Coude | Poignet | Main | MID | MIG | groupe_age2 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TD | TD1 | 10.90 | 2 | 517 | 475 | 992 | 366 | 151 | 0.032708 | ... | -0.019617 | 25.3 | 131.0 | 75 | 57 | 49 | 25 | 63.0 | 63.0 | 9-11 ans |
| 1 | TD | TD2 | 9.20 | 1 | 465 | 389 | 854 | 245 | 220 | 0.069070 | ... | -0.046824 | 33.0 | 136.0 | 87 | 70 | 50 | 23 | 70.0 | 70.0 | 9-11 ans |
| 2 | TD | TD3 | 10.10 | 2 | 545 | 541 | 1086 | 215 | 330 | 0.034305 | ... | 0.085539 | 30.6 | 138.0 | 82 | 57 | 45 | 26 | 72.5 | 72.0 | 9-11 ans |
| 3 | TD | TD4 | 10.05 | 1 | 471 | 201 | 672 | 273 | 198 | 0.014398 | ... | 0.153718 | 31.5 | 134.0 | 70 | 57 | 44 | 20 | 71.0 | 71.0 | 9-11 ans |
| 4 | TD | TD5 | 6.10 | 1 | 444 | 201 | 645 | 226 | 218 | 0.051200 | ... | -0.143763 | 29.0 | 130.0 | 82 | 64 | 51 | 29 | 64.0 | 64.0 | 6-8 ans |
5 rows × 30 columns
# Liste des colonnes d'intérêt
colonnes_initiation_marche = [
'TAju.ms', 'TExe.ms', 'TPas.ms', 'TLoad.ms', 'TUnload.ms',
'CoP_tot_AP.Long', 'CoP_tot_ML.Larg', 'CoP_loadAP.Long',
'CoP_load_ML.Larg', 'CoP_unload_ML.Larg', 'Vpic_load_AP.ms',
'Vpic_load_ML.ms', 'Vpic_unload_ML.ms', 'BOS_AP_Init.m',
'BOS_ML_Init.m', 'MOS_AP_FOcr.Long', 'MOS_ML_FOcr.Larg'
]
# Boucle sur chaque variable pour créer un barplot
for colonne in colonnes_initiation_marche:
plt.figure(figsize=(8, 6))
# Calculer les moyennes de la variable pour chaque groupe d'âge
moyennes_par_groupe = df.groupby('groupe_age2')[colonne].mean().reset_index()
# Création du bar plot
sns.barplot(x='groupe_age2', y=colonne, hue='groupe_age2', data=moyennes_par_groupe)
plt.title(f'Moyenne de {colonne} par groupe d\'âge')
plt.xlabel('Groupe d\'âge')
plt.ylabel(f'Moyenne de {colonne}')
# Afficher le graphique
plt.show()
# Bar plot groupé (exemple avec les moyennes)
# Calculer les moyennes de BOS_AP_Init.m pour chaque groupe d'âge
moyennes_bos_par_groupe = df.groupby('groupe_age2')['BOS_AP_Init.m'].mean().reset_index()
# Créer le bar plot groupé
plt.figure(figsize=(8, 6))
sns.barplot(x='groupe_age2', y='BOS_AP_Init.m',hue='groupe_age2', data=moyennes_bos_par_groupe)
plt.title('Moyenne de BOS_AP_Init.m par groupe d\'âge')
plt.xlabel('Groupe d\'âge')
plt.ylabel('Moyenne de BOS_AP_Init.m')
plt.show()
On remarque qu’en moyenne les enfants qui ont entre 9 et 11 ans affichent une longue base de support que ceux ayant entre 6 et 8 ans. Pour pouvoir valider ou pas cette hypothèse, on va utiliser le test de Student pour comparer les moyennes de ces deux groupes. Est ce que les conditions sont satisfaites pour appliquer le test ?
Est ce que les deux groupes suivent une loi normale ?
Vérifier la normalité de chaque variable pour les deux groupes d’âge à l’aide de Q-Q plots (Quantile-Quantile plots)
from scipy import stats # Import the stats module
# Extraire les groupes d'âge uniques
groupes_age = df['groupe_age2'].unique()
# Vérifier si au moins deux groupes existent
if len(groupes_age) >= 2:
for colonne in colonnes_initiation_marche: # Boucle sur chaque variable
# Créer la figure pour les deux groupes
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
for i in range(2): # Boucle sur les deux premiers groupes d'âge
groupe_actuel = df[df['groupe_age2'] == groupes_age[i]]
# Créer le Q-Q plot pour la variable actuelle
stats.probplot(groupe_actuel[colonne], dist="norm", plot=axes[i])
# Ajouter le titre
axes[i].set_title(f"Q-Q plot de {colonne} pour {i+1}ème groupe d'âge")
# Ajuster l'espacement et afficher
plt.tight_layout()
plt.show()
else:
print("Il n'y a pas au moins deux groupes d'âge dans le DataFrame.")
Focus sur BOS_AP_Init.m
import scipy.stats as stats
# Extraire les groupes d'âge uniques
groupes_age = df['groupe_age2'].unique()
# Vérifier si au moins deux groupes d'âge existent
if len(groupes_age) >= 2:
# Créer la figure et les axes pour les deux graphiques
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
# Itérer sur les deux premiers groupes d'âge
for i in range(2):
# Filtrer pour obtenir le groupe d'âge actuel
groupe_actuel = df[df['groupe_age2'] == groupes_age[i]]
# Créer le Q-Q plot
stats.probplot(groupe_actuel['BOS_AP_Init.m'], dist="norm", plot=axes[i])
# Ajouter le titre
axes[i].set_title(f"Distribution de BOS_AP_Init.m pour le {i+1}ème groupe d'âge")
# Ajuster l'espacement entre les graphiques
plt.tight_layout()
# Afficher les graphiques
plt.show()
else:
print("Il n'y a pas au moins deux groupes d'âge dans le DataFrame.")
1. Choix du test
Conditions d'application
Test t de Student : Utilisé pour comparer les moyennes de deux groupes indépendants.
Conditions :
Les données doivent suivre une distribution normale dans chaque groupe.
Les variances des deux groupes doivent être égales (homoscédasticité).
Test de Mann-Whitney (test non paramétrique) : Utilisé lorsque les conditions du test t ne sont pas remplies.
Conditions :
Les données ne suivent pas une distribution normale.
Les variances ne sont pas égales.
a.Vérification de la normalité (test de Shapiro-Wilk) Le test de Shapiro-Wilk permet de vérifier si les données suivent une distribution normale.
- Si p-value > 0.05, les données suivent une distribution normale.
- Si p-value <= 0.05, les données ne suivent pas une distribution normale.
Toutes les variables
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import shapiro, levene, ttest_ind, mannwhitneyu
# Stocker les résultats
results_list = []
# Boucle sur chaque variable
for colonne in colonnes_initiation_marche:
print(f"\n🔹 Analyse pour {colonne}")
# Séparer les groupes d'âge
group_6_8 = df[df['groupe_age2'] == '6-8 ans'][colonne].dropna()
group_9_11 = df[df['groupe_age2'] == '9-11 ans'][colonne].dropna()
# Vérification de la normalité (Shapiro-Wilk)
stat_6_8, p_6_8 = shapiro(group_6_8)
stat_9_11, p_9_11 = shapiro(group_9_11)
print(f" ➤ Shapiro-Wilk 6-8 ans : p-value = {p_6_8:.4f}")
print(f" ➤ Shapiro-Wilk 9-11 ans : p-value = {p_9_11:.4f}")
# Vérification de l'égalité des variances (Levene)
stat_levene, p_levene = levene(group_6_8, group_9_11)
print(f" ➤ Test de Levene : p-value = {p_levene:.4f}")
# Choix du test en fonction des conditions
if p_6_8 > 0.05 and p_9_11 > 0.05 and p_levene > 0.05:
# Test t de Student
stat_test, p_value = ttest_ind(group_6_8, group_9_11)
test_name = "Test t de Student"
else:
# Test de Mann-Whitney
stat_test, p_value = mannwhitneyu(group_6_8, group_9_11)
test_name = "Test de Mann-Whitney"
print(f" ➤ {test_name} : p-value = {p_value:.4f}")
# Stocker les résultats
results_list.append({
'Variable': colonne,
'Test': test_name,
'Statistique': stat_test,
'p-value': p_value
})
# Affichage des Boxplots
plt.figure(figsize=(8, 6))
sns.boxplot(x='groupe_age2', y=colonne, hue = "groupe_age2",data=df)
plt.title(f"Comparaison de {colonne} entre 6-8 ans et 9-11 ans")
plt.xlabel("Groupe d'âge")
plt.ylabel(colonne)
plt.show()
# Affichage des Violin plots
plt.figure(figsize=(8, 6))
sns.violinplot(x='groupe_age2', y=colonne, hue="groupe_age2", data=df)
plt.title(f"Comparaison de {colonne} entre 6-8 ans et 9-11 ans")
plt.xlabel("Groupe d'âge")
plt.ylabel(colonne)
plt.show()
# Affichage des résultats sous forme de DataFrame
results_df = pd.DataFrame(results_list)
print("\n📊 Résumé des résultats :")
print(results_df)
🔹 Analyse pour TAju.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.6793 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.0457 ➤ Test de Levene : p-value = 0.2394 ➤ Test de Mann-Whitney : p-value = 0.6033
🔹 Analyse pour TExe.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.0079 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.0008 ➤ Test de Levene : p-value = 0.9528 ➤ Test de Mann-Whitney : p-value = 0.4843
🔹 Analyse pour TPas.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.1229 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.2924 ➤ Test de Levene : p-value = 0.7367 ➤ Test t de Student : p-value = 0.6437
🔹 Analyse pour TLoad.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.8472 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.5852 ➤ Test de Levene : p-value = 0.9159 ➤ Test t de Student : p-value = 0.2228
🔹 Analyse pour TUnload.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.7992 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.3022 ➤ Test de Levene : p-value = 0.6059 ➤ Test t de Student : p-value = 0.5058
🔹 Analyse pour CoP_tot_AP.Long ➤ Shapiro-Wilk 6-8 ans : p-value = 0.9677 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.8908 ➤ Test de Levene : p-value = 0.0758 ➤ Test t de Student : p-value = 0.1266
🔹 Analyse pour CoP_tot_ML.Larg ➤ Shapiro-Wilk 6-8 ans : p-value = 0.6436 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.7650 ➤ Test de Levene : p-value = 0.1610 ➤ Test t de Student : p-value = 0.5421
🔹 Analyse pour CoP_loadAP.Long ➤ Shapiro-Wilk 6-8 ans : p-value = 0.2239 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.0381 ➤ Test de Levene : p-value = 0.1767 ➤ Test de Mann-Whitney : p-value = 0.4176
🔹 Analyse pour CoP_load_ML.Larg ➤ Shapiro-Wilk 6-8 ans : p-value = 0.1175 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.7269 ➤ Test de Levene : p-value = 0.1692 ➤ Test t de Student : p-value = 0.0703
🔹 Analyse pour CoP_unload_ML.Larg ➤ Shapiro-Wilk 6-8 ans : p-value = 0.1855 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.3292 ➤ Test de Levene : p-value = 0.4953 ➤ Test t de Student : p-value = 0.7407
🔹 Analyse pour Vpic_load_AP.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.1007 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.0589 ➤ Test de Levene : p-value = 0.4548 ➤ Test t de Student : p-value = 0.0144
🔹 Analyse pour Vpic_load_ML.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.0600 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.9401 ➤ Test de Levene : p-value = 0.5612 ➤ Test t de Student : p-value = 0.0790
🔹 Analyse pour Vpic_unload_ML.ms ➤ Shapiro-Wilk 6-8 ans : p-value = 0.4097 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.8638 ➤ Test de Levene : p-value = 0.8987 ➤ Test t de Student : p-value = 0.8260
🔹 Analyse pour BOS_AP_Init.m ➤ Shapiro-Wilk 6-8 ans : p-value = 0.6674 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.9612 ➤ Test de Levene : p-value = 0.3990 ➤ Test t de Student : p-value = 0.0001
🔹 Analyse pour BOS_ML_Init.m ➤ Shapiro-Wilk 6-8 ans : p-value = 0.2411 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.8473 ➤ Test de Levene : p-value = 0.9648 ➤ Test t de Student : p-value = 0.7109
🔹 Analyse pour MOS_AP_FOcr.Long ➤ Shapiro-Wilk 6-8 ans : p-value = 0.6606 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.4117 ➤ Test de Levene : p-value = 0.5845 ➤ Test t de Student : p-value = 0.8422
🔹 Analyse pour MOS_ML_FOcr.Larg ➤ Shapiro-Wilk 6-8 ans : p-value = 0.9142 ➤ Shapiro-Wilk 9-11 ans : p-value = 0.9313 ➤ Test de Levene : p-value = 0.3852 ➤ Test t de Student : p-value = 0.3811
📊 Résumé des résultats :
Variable Test Statistique p-value
0 TAju.ms Test de Mann-Whitney 125.000000 0.603280
1 TExe.ms Test de Mann-Whitney 129.000000 0.484336
2 TPas.ms Test t de Student 0.467533 0.643737
3 TLoad.ms Test t de Student 1.246664 0.222850
4 TUnload.ms Test t de Student -0.674123 0.505761
5 CoP_tot_AP.Long Test t de Student -1.574538 0.126596
6 CoP_tot_ML.Larg Test t de Student -0.617258 0.542052
7 CoP_loadAP.Long Test de Mann-Whitney 92.000000 0.417581
8 CoP_load_ML.Larg Test t de Student -1.881514 0.070337
9 CoP_unload_ML.Larg Test t de Student 0.334270 0.740667
10 Vpic_load_AP.ms Test t de Student -2.608261 0.014435
11 Vpic_load_ML.ms Test t de Student -1.822849 0.079022
12 Vpic_unload_ML.ms Test t de Student 0.221876 0.826020
13 BOS_AP_Init.m Test t de Student -4.686575 0.000065
14 BOS_ML_Init.m Test t de Student 0.374394 0.710932
15 MOS_AP_FOcr.Long Test t de Student -0.200908 0.842223
16 MOS_ML_FOcr.Larg Test t de Student -0.889947 0.381077
Résumé des résultats sous forme de tableau
# Résumé des résultats sous forme de tableau
results = {
'Variable': ['TAju.ms', 'TExe.ms', 'TPas.ms', 'TLoad.ms', 'TUnload.ms',
'CoP_tot_AP.Long', 'CoP_tot_ML.Larg', 'CoP_loadAP.Long', 'CoP_load_ML.Larg',
'CoP_unload_ML.Larg', 'Vpic_load_AP.ms', 'Vpic_load_ML.ms', 'Vpic_unload_ML.ms',
'BOS_AP_Init.m', 'BOS_ML_Init.m', 'MOS_AP_FOcr.Long', 'MOS_ML_FOcr.Larg'],
'Test': ['Mann-Whitney', 'Mann-Whitney', 'Student', 'Student', 'Student',
'Student', 'Student', 'Mann-Whitney', 'Student', 'Student',
'Student', 'Student', 'Student', 'Student', 'Student', 'Student', 'Student'],
'p-value': [0.603, 0.484, 0.644, 0.223, 0.506, 0.127, 0.542, 0.418, 0.070,
0.741, 0.014, 0.079, 0.826, 0.000065, 0.711, 0.842, 0.381]
}
df_results = pd.DataFrame(results)
# Ajouter une colonne pour l'interprétation
df_results['Significatif'] = df_results['p-value'] < 0.05
print(df_results)
Variable Test p-value Significatif 0 TAju.ms Mann-Whitney 0.603000 False 1 TExe.ms Mann-Whitney 0.484000 False 2 TPas.ms Student 0.644000 False 3 TLoad.ms Student 0.223000 False 4 TUnload.ms Student 0.506000 False 5 CoP_tot_AP.Long Student 0.127000 False 6 CoP_tot_ML.Larg Student 0.542000 False 7 CoP_loadAP.Long Mann-Whitney 0.418000 False 8 CoP_load_ML.Larg Student 0.070000 False 9 CoP_unload_ML.Larg Student 0.741000 False 10 Vpic_load_AP.ms Student 0.014000 True 11 Vpic_load_ML.ms Student 0.079000 False 12 Vpic_unload_ML.ms Student 0.826000 False 13 BOS_AP_Init.m Student 0.000065 True 14 BOS_ML_Init.m Student 0.711000 False 15 MOS_AP_FOcr.Long Student 0.842000 False 16 MOS_ML_FOcr.Larg Student 0.381000 False
Boxplot pour visualiser la différence entre les groupes avec que les variables significatives
# Variables significatives à visualiser
variables_significatives = ["Vpic_load_AP.ms", "BOS_AP_Init.m"]
# Boucle pour afficher un boxplot pour chaque variable significative
for var in variables_significatives:
plt.figure(figsize=(8, 6))
sns.boxplot(x="groupe_age2", y=var, hue="groupe_age2",data=df)
plt.title(f"Comparaison de {var} entre 6-8 ans et 9-11 ans")
plt.xlabel("Groupe d'âge")
plt.ylabel(var)
plt.show()
🎯 Conclusion
1️⃣ Le test choisi était correct :
Test t de Student si les conditions étaient respectées. Test de Mann-Whitney sinon.
2️⃣ Les variables importantes à retenir :
✅ Vpic_load_AP.ms (p = 0.0144)
✅ BOS_AP_Init.m (p = 0.000065)
3️⃣ Interprétation des résultats :
Vpic_load_AP.ms → Montre une différence significative entre les groupes d'âge.
BOS_AP_Init.m → Fortement significatif → Cette variable varie fortement selon l'âge.
Autres variables → Pas de différence significative entre les groupes.
from scipy.stats import shapiro
# Vérification de la normalité pour chaque groupe
group_6_8 = df[df['groupe_age2'] == '6-8 ans']['BOS_AP_Init.m']
group_9_11 = df[df['groupe_age2'] == '9-11 ans']['BOS_AP_Init.m']
# Test de Shapiro-Wilk
stat_6_8, p_6_8 = shapiro(group_6_8)
stat_9_11, p_9_11 = shapiro(group_9_11)
print(f"Shapiro-Wilk pour 6-8 ans : p-value = {p_6_8}")
print(f"Shapiro-Wilk pour 9-11 ans : p-value = {p_9_11}")
Shapiro-Wilk pour 6-8 ans : p-value = 0.6674276385275026 Shapiro-Wilk pour 9-11 ans : p-value = 0.9612253627146897
Les p-value pour les deux groupes est supérieur à 0.05 alors les données suivent une distribution normale.
Shapiro-Wilk pour 6-8 ans : p-value = 0.66 > 0.05 Shapiro-Wilk pour 9-11 ans :** p-value = 0.96 > 0.05**
b. Vérification de l'égalité des variances (test de Levene) Le test de Levene permet de vérifier si les variances des deux groupes sont égales.
Si p-value > 0.05, les variances sont égales.
Si p-value <= 0.05, les variances ne sont pas égales.
from scipy.stats import levene
# Test de Levene
stat, p_levene = levene(group_6_8, group_9_11)
print(f"Test de Levene : p-value = {p_levene}")
Test de Levene : p-value = 0.39896179750582994
On obtient comme p-value = 0.39 > 0.05, alors les variances sont égales.
Etant donné que les données suivent une distribution normale et que les variances sont égales, nous pouvons utiliser le test t de Student.
from scipy.stats import ttest_ind
# Test t de Student
t_stat, p_value = ttest_ind(group_6_8, group_9_11)
print(f"Test t de Student : t = {t_stat}, p-value = {p_value}")
Test t de Student : t = -4.686574811481989, p-value = 6.532247616310009e-05
L'analyse du test t de Student repose sur l'interprétation de la valeur de t et de la p-value. Voici comment comprendre ton résultat :
1. Valeur de t :
- t = -4.69 (environ)
- Une valeur t négative signifie que la moyenne du premier groupe est inférieure à celle du second groupe.
- Plus t est éloigné de 0, plus la différence entre les groupes est grande.
2. p-value :
- p-value = 6.53 × 10⁻⁵ ≈ 0.0000653
- Cette valeur est très petite (bien inférieure à 0.05), indiquant une différence statistiquement significative.
- Si le seuil de signification (alpha) est de 0.05 ou 0.01, on rejette l'hypothèse nulle (H₀), qui suppose qu'il n'y a pas de différence entre les moyennes des deux groupes.
3. Conclusion :
- Il y a une différence significative entre les deux groupes.
- La moyenne du premier groupe est significativement plus faible que celle du second groupe.
Présentation des résultats
a. Tableau des résultats texte en gras Vous pouvez résumer les résultats du test dans un tableau.
# Créer un tableau de résultats
results = pd.DataFrame({
'Test': ['Test t de Student' if p_6_8 > 0.05 and p_9_11 > 0.05 and p_levene > 0.05 else 'Test de Mann-Whitney'],
'Statistique': [t_stat if p_6_8 > 0.05 and p_9_11 > 0.05 and p_levene > 0.05 else u_stat],
'p-value': [p_value]
})
print(results)
Test Statistique p-value 0 Test t de Student -4.686575 0.000065
b. Graphique des résultats
Vous pouvez visualiser les distributions des deux groupes à l'aide d'un boxplot ou d'un violin plot.
# 2. Box plot
plt.figure(figsize=(8, 6))
sns.boxplot(x='groupe_age2', y='BOS_AP_Init.m',hue='groupe_age2', data=df)
plt.title('Distribution de BOS_AP_Init.m par groupe d\'âge')
plt.xlabel('Groupe d\'âge')
plt.ylabel('BOS_AP_Init.m')
plt.show()
#3. Graphique en violon
plt.figure(figsize=(8, 6))
sns.violinplot(x='groupe_age2', y='BOS_AP_Init.m',hue='groupe_age2', data=df)
plt.title("Graphique en violon : BOS_AP_Init.m par groupe d'âge")
plt.xlabel("Groupe d'âge")
plt.ylabel("BOS_AP_Init.m")
plt.show()
Graphiques :
Le boxplot et le violin plot vous permettent de visualiser les distributions des deux groupes et de confirmer visuellement les résultats du test.
Conclusion:
Nous remarquons que la p-value est très faible(inférieure à 0.05);nous rejetons l’hypothèse nulle et nous acceptons l’hypothèse alternative qui suggère une différence significative entre les deux groupes d’âge. L’intervale de confiance suggère qu’à 95% de chances;la différence réelle des moyennes entre les deux groupes se trouve entre -0.028 et -0.011; ce qui soutient encore qu’il existe une différence significative entre ces deux groupes. La différence entre ces moyennes est de 0.O19;ce qui est statistiquement significatif. En plus; les résultats de ce test sont en adéquation avec le boxplot; nous concluons que le groupe d’âge plus âgé montre des valeurs moyennes plus élevées que le groupe plus jeune. ___________________________________________________________
1. Choix du test
Conditions d'application ANOVA (Analyse de Variance) : Utilisé pour comparer les moyennes de trois groupes ou plus.
Conditions :
Les données doivent suivre une distribution normale dans chaque groupe.
Les variances des groupes doivent être égales (homoscédasticité).
Test de Kruskal-Wallis (test non paramétrique) : Utilisé lorsque les conditions de l'ANOVA ne sont pas remplies.
Conditions :
Les données ne suivent pas une distribution normale.
Les variances ne sont pas égales.
2. Vérification des conditions
a. Vérification de la normalité (test de Shapiro-Wilk)
Le test de Shapiro-Wilk permet de vérifier si les données suivent une distribution normale.
# Créer la nouvelle variable "groupe_age3" pour les 3 groupes d'âge
def n_categoriser_age(age):
if 6 <= age <= 7.9:
return "6-7 ans"
elif 8 <= age <= 9.9:
return "8-9 ans"
elif 10 <= age <= 12:
return "10-11 ans"
else:
return None # Ou une autre catégorie si vous avez d'autres âges
df['groupe_age3'] = df['Age'].apply(n_categoriser_age)
# Afficher le DataFrame mis à jour
df.head()
| GROUPE | Sujet | Age | Sexe | TAju.ms | TExe.ms | TPas.ms | TLoad.ms | TUnload.ms | CoP_tot_AP.Long | ... | Weight | Height | Epaule | Coude | Poignet | Main | MID | MIG | groupe_age2 | groupe_age3 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TD | TD1 | 10.90 | 2 | 517 | 475 | 992 | 366 | 151 | 0.032708 | ... | 25.3 | 131.0 | 75 | 57 | 49 | 25 | 63.0 | 63.0 | 9-11 ans | 10-11 ans |
| 1 | TD | TD2 | 9.20 | 1 | 465 | 389 | 854 | 245 | 220 | 0.069070 | ... | 33.0 | 136.0 | 87 | 70 | 50 | 23 | 70.0 | 70.0 | 9-11 ans | 8-9 ans |
| 2 | TD | TD3 | 10.10 | 2 | 545 | 541 | 1086 | 215 | 330 | 0.034305 | ... | 30.6 | 138.0 | 82 | 57 | 45 | 26 | 72.5 | 72.0 | 9-11 ans | 10-11 ans |
| 3 | TD | TD4 | 10.05 | 1 | 471 | 201 | 672 | 273 | 198 | 0.014398 | ... | 31.5 | 134.0 | 70 | 57 | 44 | 20 | 71.0 | 71.0 | 9-11 ans | 10-11 ans |
| 4 | TD | TD5 | 6.10 | 1 | 444 | 201 | 645 | 226 | 218 | 0.051200 | ... | 29.0 | 130.0 | 82 | 64 | 51 | 29 | 64.0 | 64.0 | 6-8 ans | 6-7 ans |
5 rows × 31 columns
Toutes les variables
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import shapiro, levene, f_oneway, kruskal
# Stocker les résultats
n_results_list = []
# Boucle sur chaque variable
for colonne in colonnes_initiation_marche:
print(f"\n🔹 Analyse pour {colonne}")
# Séparer les groupes d'âge
group_6_7 = df[df['groupe_age3'] == '6-7 ans'][colonne].dropna()
group_8_9 = df[df['groupe_age3'] == '8-9 ans'][colonne].dropna()
group_10_11 = df[df['groupe_age3'] == '10-11 ans'][colonne].dropna()
# Vérification de la normalité (Shapiro-Wilk)
stat_6_7, p_6_7 = shapiro(group_6_7)
stat_8_9, p_8_9 = shapiro(group_8_9)
stat_10_11, p_10_11 = shapiro(group_10_11)
print(f" ➤ Shapiro-Wilk 6-7 ans : p-value = {p_6_7:.4f}")
print(f" ➤ Shapiro-Wilk 8-9 ans : p-value = {p_8_9:.4f}")
print(f" ➤ Shapiro-Wilk 10-11 ans : p-value = {p_10_11:.4f}")
# Vérification de l'égalité des variances (Levene)
stat_levene, p_levene = levene(group_6_7, group_8_9, group_10_11)
print(f" ➤ Test de Levene : p-value = {p_levene:.4f}")
# Choix du test en fonction des conditions
if p_6_7 > 0.05 and p_8_9 > 0.05 and p_10_11 > 0.05 and p_levene > 0.05:
# ANOVA
stat_test, p_value = f_oneway(group_6_7, group_8_9, group_10_11)
test_name = "ANOVA"
else:
# Test de Kruskal-Wallis
stat_test, p_value = kruskal(group_6_7, group_8_9, group_10_11)
test_name = "Kruskal-Wallis"
print(f" ➤ {test_name} : p-value = {p_value:.4f}")
# Stocker les résultats
n_results_list.append({
'Variable': colonne,
'Test': test_name,
'Statistique': stat_test,
'p-value': p_value
})
# Générer Boxplot
plt.figure(figsize=(8, 6))
sns.boxplot(x="groupe_age3", y=colonne, hue="groupe_age3", data=df)
plt.title(f"Comparaison de {colonne} entre 6-7 ans, 8-9 ans et 10-11 ans")
plt.xlabel("Groupe d'âge")
plt.ylabel(colonne)
plt.show()
# Générer Violin plot
plt.figure(figsize=(8, 6))
sns.violinplot(x="groupe_age3", y=colonne, hue="groupe_age3", data=df)
plt.title(f"Comparaison de {colonne} entre 6-7 ans, 8-9 ans et 10-11 ans")
plt.xlabel("Groupe d'âge")
plt.ylabel(colonne)
plt.show()
# Affichage des résultats sous forme de tableau
n_results_df = pd.DataFrame(n_results_list)
print("\n📊 Résumé des résultats :")
print(n_results_df)
🔹 Analyse pour TAju.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.3485 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.5803 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.0309 ➤ Test de Levene : p-value = 0.7692 ➤ Kruskal-Wallis : p-value = 0.6635
🔹 Analyse pour TExe.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.0020 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.1301 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.0000 ➤ Test de Levene : p-value = 0.9405 ➤ Kruskal-Wallis : p-value = 0.0622
🔹 Analyse pour TPas.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.1564 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.2083 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.4589 ➤ Test de Levene : p-value = 0.5875 ➤ ANOVA : p-value = 0.7609
🔹 Analyse pour TLoad.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.8830 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.5607 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.7953 ➤ Test de Levene : p-value = 0.8265 ➤ ANOVA : p-value = 0.7482
🔹 Analyse pour TUnload.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.4075 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.5720 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.3477 ➤ Test de Levene : p-value = 0.4586 ➤ ANOVA : p-value = 0.4119
🔹 Analyse pour CoP_tot_AP.Long ➤ Shapiro-Wilk 6-7 ans : p-value = 0.7845 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.8073 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.7997 ➤ Test de Levene : p-value = 0.2006 ➤ ANOVA : p-value = 0.7636
🔹 Analyse pour CoP_tot_ML.Larg ➤ Shapiro-Wilk 6-7 ans : p-value = 0.7296 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.9895 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.7406 ➤ Test de Levene : p-value = 0.5484 ➤ ANOVA : p-value = 0.2785
🔹 Analyse pour CoP_loadAP.Long ➤ Shapiro-Wilk 6-7 ans : p-value = 0.2404 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.1935 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.1955 ➤ Test de Levene : p-value = 0.4384 ➤ ANOVA : p-value = 0.6544
🔹 Analyse pour CoP_load_ML.Larg ➤ Shapiro-Wilk 6-7 ans : p-value = 0.1277 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.7529 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.7314 ➤ Test de Levene : p-value = 0.3574 ➤ ANOVA : p-value = 0.1945
🔹 Analyse pour CoP_unload_ML.Larg ➤ Shapiro-Wilk 6-7 ans : p-value = 0.2154 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.5582 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.3753 ➤ Test de Levene : p-value = 0.9818 ➤ ANOVA : p-value = 0.3068
🔹 Analyse pour Vpic_load_AP.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.0388 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.0985 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.4028 ➤ Test de Levene : p-value = 0.9988 ➤ Kruskal-Wallis : p-value = 0.0814
🔹 Analyse pour Vpic_load_ML.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.0954 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.4006 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.8055 ➤ Test de Levene : p-value = 0.5866 ➤ ANOVA : p-value = 0.2527
🔹 Analyse pour Vpic_unload_ML.ms ➤ Shapiro-Wilk 6-7 ans : p-value = 0.4265 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.5719 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.6362 ➤ Test de Levene : p-value = 0.2913 ➤ ANOVA : p-value = 0.8542
🔹 Analyse pour BOS_AP_Init.m ➤ Shapiro-Wilk 6-7 ans : p-value = 0.5793 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.2572 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.8937 ➤ Test de Levene : p-value = 0.2094 ➤ ANOVA : p-value = 0.0003
🔹 Analyse pour BOS_ML_Init.m ➤ Shapiro-Wilk 6-7 ans : p-value = 0.4443 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.2571 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.9458 ➤ Test de Levene : p-value = 0.1384 ➤ ANOVA : p-value = 0.6125
🔹 Analyse pour MOS_AP_FOcr.Long ➤ Shapiro-Wilk 6-7 ans : p-value = 0.5891 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.1647 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.1454 ➤ Test de Levene : p-value = 0.2832 ➤ ANOVA : p-value = 0.7579
🔹 Analyse pour MOS_ML_FOcr.Larg ➤ Shapiro-Wilk 6-7 ans : p-value = 0.9163 ➤ Shapiro-Wilk 8-9 ans : p-value = 0.5196 ➤ Shapiro-Wilk 10-11 ans : p-value = 0.8664 ➤ Test de Levene : p-value = 0.0896 ➤ ANOVA : p-value = 0.6184
📊 Résumé des résultats :
Variable Test Statistique p-value
0 TAju.ms Kruskal-Wallis 0.820504 0.663483
1 TExe.ms Kruskal-Wallis 5.555462 0.062179
2 TPas.ms ANOVA 0.276009 0.760921
3 TLoad.ms ANOVA 0.293245 0.748184
4 TUnload.ms ANOVA 0.916685 0.411929
5 CoP_tot_AP.Long ANOVA 0.272357 0.763650
6 CoP_tot_ML.Larg ANOVA 1.340770 0.278512
7 CoP_loadAP.Long ANOVA 0.430729 0.654424
8 CoP_load_ML.Larg ANOVA 1.740893 0.194476
9 CoP_unload_ML.Larg ANOVA 1.234761 0.306813
10 Vpic_load_AP.ms Kruskal-Wallis 5.017580 0.081367
11 Vpic_load_ML.ms ANOVA 1.448291 0.252651
12 Vpic_unload_ML.ms ANOVA 0.158501 0.854210
13 BOS_AP_Init.m ANOVA 11.414744 0.000255
14 BOS_ML_Init.m ANOVA 0.499272 0.612467
15 MOS_AP_FOcr.Long ANOVA 0.280035 0.757926
16 MOS_ML_FOcr.Larg ANOVA 0.489296 0.618389
Tableau avec significativité
n_df_results = pd.DataFrame(n_results_df)
# Ajouter une colonne pour l'interprétation
n_df_results['Significatif'] = n_df_results['p-value'] < 0.05
print(n_df_results)
Variable Test Statistique p-value Significatif 0 TAju.ms Kruskal-Wallis 0.820504 0.663483 False 1 TExe.ms Kruskal-Wallis 5.555462 0.062179 False 2 TPas.ms ANOVA 0.276009 0.760921 False 3 TLoad.ms ANOVA 0.293245 0.748184 False 4 TUnload.ms ANOVA 0.916685 0.411929 False 5 CoP_tot_AP.Long ANOVA 0.272357 0.763650 False 6 CoP_tot_ML.Larg ANOVA 1.340770 0.278512 False 7 CoP_loadAP.Long ANOVA 0.430729 0.654424 False 8 CoP_load_ML.Larg ANOVA 1.740893 0.194476 False 9 CoP_unload_ML.Larg ANOVA 1.234761 0.306813 False 10 Vpic_load_AP.ms Kruskal-Wallis 5.017580 0.081367 False 11 Vpic_load_ML.ms ANOVA 1.448291 0.252651 False 12 Vpic_unload_ML.ms ANOVA 0.158501 0.854210 False 13 BOS_AP_Init.m ANOVA 11.414744 0.000255 True 14 BOS_ML_Init.m ANOVA 0.499272 0.612467 False 15 MOS_AP_FOcr.Long ANOVA 0.280035 0.757926 False 16 MOS_ML_FOcr.Larg ANOVA 0.489296 0.618389 False
Visualisation de box plot et violon plot avec la seule variable pertinente BOS_AP_Init.m
# Box plot
plt.figure(figsize=(8, 6))
sns.boxplot(x='groupe_age3', y='BOS_AP_Init.m',hue='groupe_age3', data=df)
plt.title('Distribution de BOS_AP_Init.m par groupe d\'âge')
plt.xlabel('Groupe d\'âge')
plt.ylabel('BOS_AP_Init.m')
plt.show()
# Graphique en violon
plt.figure(figsize=(8, 6))
sns.violinplot(x='groupe_age3', y='BOS_AP_Init.m',hue='groupe_age3', data=df)
plt.title("Graphique en violon : BOS_AP_Init.m par groupe d'âge")
plt.xlabel("Groupe d'âge")
plt.ylabel("BOS_AP_Init.m")
plt.show()
Le test ANOVA compare la variable BOS_AP_Init.m entre les trois groupes d'âge (6-7 ans, 8-9 ans, 10-11 ans). Voici comment interpréter les résultats :
1. Valeur de F
- F = 11.41 (environ)
- Cette valeur représente le rapport entre la variabilité entre les groupes et la variabilité à l'intérieur des groupes.
- Plus F est élevé, plus la différence entre les moyennes des groupes est importante par rapport à la variabilité interne.
2. p-value
- p = 0.000255 (environ 0.0003)
- Cette valeur est très inférieure au seuil classique de 0.05 ou 0.01.
- Cela signifie qu'on rejette l'hypothèse nulle (H₀), qui suppose que les trois groupes ont des moyennes identiques pour BOS_AP_Init.m.
- Autrement dit, il existe une différence significative entre au moins deux des trois groupes.
3. Conclusion
- L'âge influence significativement BOS_AP_Init.m.
- Mais l’ANOVA ne dit pas entre quels groupes la différence est significative.
Pour aller plus loin, il faut faire un test post-hoc (comme Tukey HSD) pour identifier quels groupes sont significativement différents.
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# Appliquer le test de Tukey
tukey_results = pairwise_tukeyhsd(endog=df['BOS_AP_Init.m'], groups=df['groupe_age3'], alpha=0.05)
# Afficher les résultats
print(tukey_results)
Multiple Comparison of Means - Tukey HSD, FWER=0.05 ======================================================== group1 group2 meandiff p-adj lower upper reject -------------------------------------------------------- 10-11 ans 6-7 ans -0.0221 0.0002 -0.0338 -0.0105 True 10-11 ans 8-9 ans -0.0078 0.3833 -0.0222 0.0066 False 6-7 ans 8-9 ans 0.0143 0.045 0.0003 0.0283 True --------------------------------------------------------
Synthèse des résultats
10-11 ans vs 6-7 ans :
Différence significative (p-adj = 0.0002).
Le groupe 10-11 ans a une moyenne significativement plus basse que le groupe 6-7 ans.
10-11 ans vs 8-9 ans :
Pas de différence significative (p-adj = 0.3833).
Les moyennes des groupes 10-11 ans et 8-9 ans sont similaires.
6-7 ans vs 8-9 ans :
Différence significative (p-adj = 0.045).
Le groupe 6-7 ans a une moyenne significativement plus élevée que le groupe 8-9 ans.
Visualisation des résultats du test de Tukey
Vous pouvez également visualiser les résultats du test de Tukey à l'aide d'un graphique :
# Visualisation des résultats du test de Tukey
tukey_results.plot_simultaneous()
plt.title("Comparaison des groupes avec le test de Tukey")
plt.xlabel("Différence de moyennes")
plt.ylabel("Groupes")
plt.show()
from scipy.stats import shapiro
# Vérification de la normalité pour chaque groupe
group_6_7 = df[df['groupe_age3'] == '6-7 ans']['BOS_AP_Init.m']
group_8_9 = df[df['groupe_age3'] == '8-9 ans']['BOS_AP_Init.m']
group_10_11 = df[df['groupe_age3'] == '10-11 ans']['BOS_AP_Init.m']
# Test de Shapiro-Wilk
stat_6_7, p_6_7 = shapiro(group_6_7)
stat_8_9, p_8_9 = shapiro(group_8_9)
stat_10_11, p_10_11 = shapiro(group_10_11)
print(f"Shapiro-Wilk pour 6-7 ans : p-value = {p_6_7}")
print(f"Shapiro-Wilk pour 8-9 ans : p-value = {p_8_9}")
print(f"Shapiro-Wilk pour 10-11 ans : p-value = {p_10_11}")
Shapiro-Wilk pour 6-7 ans : p-value = 0.5793156012318983 Shapiro-Wilk pour 8-9 ans : p-value = 0.2572245463069386 Shapiro-Wilk pour 10-11 ans : p-value = 0.8936550210267022
Conclusion
Différences significatives :
Il y a une différence significative entre les groupes 6-7 ans et 10-11 ans, ainsi qu'entre les groupes 6-7 ans et 8-9 ans.
Cela suggère que l'âge a un effet significatif sur la variable étudiée (par exemple, TUnload.ms), en particulier pour les plus jeunes enfants (6-7 ans) par rapport aux autres groupes.
Pas de différence significative :
Il n'y a pas de différence significative entre les groupes 8-9 ans et 10-11 ans.
3.3 : Approche Alternative pour Tester l'Effet de l'Âge : Méthodes et Résultats
Oui, il est tout à fait possible de tester l'effet de l'âge sans diviser les données en groupes discrets (comme 6-7 ans, 8-9 ans, etc.). La régression est une méthode couramment utilisée pour cela, mais il existe également d'autres approches. Voici une explication détaillée des différentes méthodes et pourquoi elles sont pertinentes, ainsi que des exemples de mise en œuvre en Python.
1. Pourquoi utiliser la régression ?
La régression est une méthode puissante pour étudier l'effet de l'âge sur une variable d'intérêt (par exemple, TUnload.ms) sans avoir à diviser les données en groupes. Voici pourquoi elle est appropriée :
a. Traitement de l'âge comme une variable continue
L'âge est une variable continue, et la régression permet de modéliser la relation entre l'âge et une autre variable sans perdre d'informations en créant des groupes artificiels.
Cela permet de capturer des tendances plus fines et non linéaires.
b. Flexibilité
La régression peut être linéaire ou non linéaire (par exemple, en ajoutant des termes polynomiaux ou en utilisant des splines).
Elle permet également de contrôler l'effet d'autres variables (par exemple, la taille ou le poids) pour éviter les biais.
c. Interprétabilité Les coefficients de régression fournissent une mesure quantitative de l'effet de l'âge sur la variable d'intérêt.
Vous pouvez également calculer des intervalles de confiance et des p-values pour évaluer la significativité des effets.
import statsmodels.api as sm
# Boucle pour chaque variable dans la liste
for colonne in colonnes_initiation_marche:
# Régression linéaire pour la colonne actuelle
X = sm.add_constant(df['Age']) # Ajouter une constante (intercept)
y = df[colonne] # Utiliser la colonne actuelle comme variable dépendante
model = sm.OLS(y, X).fit() # Ajuster le modèle
print(f"Résultats de la régression pour {colonne}:")
print(model.summary()) # Afficher les résultats de la régression
# Vérifier si l'effet de l'âge est significatif
p_value = model.pvalues['Age']
if p_value < 0.05: # Seuil de signification à 5%
variables_significatives.append(colonne)
print(f"L'effet de l'âge sur {colonne} est significatif (p-value: {p_value:.4f})")
# Visualisation de la régression linéaire
plt.figure(figsize=(8, 6))
sns.regplot(x='Age', y=colonne, data=df, line_kws={'color': 'red'})
plt.title(f"Régression linéaire : {colonne} en fonction de l'âge")
plt.xlabel("Âge")
plt.ylabel(f"{colonne} (ms)")
plt.show()
Résultats de la régression pour TAju.ms:
OLS Regression Results
==============================================================================
Dep. Variable: TAju.ms R-squared: 0.000
Model: OLS Adj. R-squared: -0.036
Method: Least Squares F-statistic: 0.003415
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.954
Time: 11:00:44 Log-Likelihood: -179.42
No. Observations: 30 AIC: 362.8
Df Residuals: 28 BIC: 365.6
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 497.4655 94.175 5.282 0.000 304.556 690.375
Age 0.6274 10.735 0.058 0.954 -21.362 22.617
==============================================================================
Omnibus: 10.324 Durbin-Watson: 2.705
Prob(Omnibus): 0.006 Jarque-Bera (JB): 15.849
Skew: 0.599 Prob(JB): 0.000362
Kurtosis: 6.353 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour TExe.ms:
OLS Regression Results
==============================================================================
Dep. Variable: TExe.ms R-squared: 0.001
Model: OLS Adj. R-squared: -0.035
Method: Least Squares F-statistic: 0.02414
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.878
Time: 11:00:44 Log-Likelihood: -182.88
No. Observations: 30 AIC: 369.8
Df Residuals: 28 BIC: 372.6
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 272.0852 105.688 2.574 0.016 55.592 488.578
Age 1.8718 12.047 0.155 0.878 -22.806 26.549
==============================================================================
Omnibus: 4.663 Durbin-Watson: 1.527
Prob(Omnibus): 0.097 Jarque-Bera (JB): 4.203
Skew: 0.857 Prob(JB): 0.122
Kurtosis: 2.349 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour TPas.ms:
OLS Regression Results
==============================================================================
Dep. Variable: TPas.ms R-squared: 0.001
Model: OLS Adj. R-squared: -0.035
Method: Least Squares F-statistic: 0.02343
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.879
Time: 11:00:44 Log-Likelihood: -192.00
No. Observations: 30 AIC: 388.0
Df Residuals: 28 BIC: 390.8
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 769.5508 143.237 5.373 0.000 476.144 1062.958
Age 2.4991 16.327 0.153 0.879 -30.946 35.944
==============================================================================
Omnibus: 0.788 Durbin-Watson: 2.008
Prob(Omnibus): 0.674 Jarque-Bera (JB): 0.779
Skew: 0.162 Prob(JB): 0.678
Kurtosis: 2.280 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour TLoad.ms:
OLS Regression Results
==============================================================================
Dep. Variable: TLoad.ms R-squared: 0.013
Model: OLS Adj. R-squared: -0.023
Method: Least Squares F-statistic: 0.3591
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.554
Time: 11:00:44 Log-Likelihood: -173.53
No. Observations: 30 AIC: 351.1
Df Residuals: 28 BIC: 353.9
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 334.7122 77.388 4.325 0.000 176.191 493.234
Age -5.2864 8.821 -0.599 0.554 -23.356 12.783
==============================================================================
Omnibus: 1.702 Durbin-Watson: 2.395
Prob(Omnibus): 0.427 Jarque-Bera (JB): 1.077
Skew: 0.464 Prob(JB): 0.584
Kurtosis: 3.027 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour TUnload.ms:
OLS Regression Results
==============================================================================
Dep. Variable: TUnload.ms R-squared: 0.017
Model: OLS Adj. R-squared: -0.018
Method: Least Squares F-statistic: 0.4772
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.495
Time: 11:00:45 Log-Likelihood: -172.63
No. Observations: 30 AIC: 349.3
Df Residuals: 28 BIC: 352.1
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 162.7533 75.103 2.167 0.039 8.912 316.595
Age 5.9137 8.561 0.691 0.495 -11.622 23.450
==============================================================================
Omnibus: 2.073 Durbin-Watson: 2.649
Prob(Omnibus): 0.355 Jarque-Bera (JB): 1.781
Skew: 0.478 Prob(JB): 0.410
Kurtosis: 2.284 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour CoP_tot_AP.Long:
OLS Regression Results
==============================================================================
Dep. Variable: CoP_tot_AP.Long R-squared: 0.046
Model: OLS Adj. R-squared: 0.012
Method: Least Squares F-statistic: 1.340
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.257
Time: 11:00:45 Log-Likelihood: 87.122
No. Observations: 30 AIC: -170.2
Df Residuals: 28 BIC: -167.4
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0263 0.013 2.014 0.054 -0.000 0.053
Age 0.0017 0.001 1.158 0.257 -0.001 0.005
==============================================================================
Omnibus: 0.166 Durbin-Watson: 1.897
Prob(Omnibus): 0.920 Jarque-Bera (JB): 0.099
Skew: 0.114 Prob(JB): 0.952
Kurtosis: 2.836 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour CoP_tot_ML.Larg:
OLS Regression Results
==============================================================================
Dep. Variable: CoP_tot_ML.Larg R-squared: 0.044
Model: OLS Adj. R-squared: 0.010
Method: Least Squares F-statistic: 1.294
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.265
Time: 11:00:45 Log-Likelihood: 73.402
No. Observations: 30 AIC: -142.8
Df Residuals: 28 BIC: -140.0
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0905 0.021 4.391 0.000 0.048 0.133
Age 0.0027 0.002 1.138 0.265 -0.002 0.007
==============================================================================
Omnibus: 0.566 Durbin-Watson: 1.895
Prob(Omnibus): 0.753 Jarque-Bera (JB): 0.670
Skew: -0.186 Prob(JB): 0.715
Kurtosis: 2.369 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour CoP_loadAP.Long:
OLS Regression Results
==============================================================================
Dep. Variable: CoP_loadAP.Long R-squared: 0.018
Model: OLS Adj. R-squared: -0.017
Method: Least Squares F-statistic: 0.5181
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.478
Time: 11:00:46 Log-Likelihood: 34.004
No. Observations: 30 AIC: -64.01
Df Residuals: 28 BIC: -61.21
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.1417 0.077 1.850 0.075 -0.015 0.299
Age 0.0063 0.009 0.720 0.478 -0.012 0.024
==============================================================================
Omnibus: 2.274 Durbin-Watson: 1.804
Prob(Omnibus): 0.321 Jarque-Bera (JB): 2.017
Skew: -0.548 Prob(JB): 0.365
Kurtosis: 2.359 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour CoP_load_ML.Larg:
OLS Regression Results
==============================================================================
Dep. Variable: CoP_load_ML.Larg R-squared: 0.121
Model: OLS Adj. R-squared: 0.089
Method: Least Squares F-statistic: 3.849
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.0598
Time: 11:00:46 Log-Likelihood: 46.456
No. Observations: 30 AIC: -88.91
Df Residuals: 28 BIC: -86.11
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0688 0.051 1.360 0.185 -0.035 0.172
Age 0.0113 0.006 1.962 0.060 -0.000 0.023
==============================================================================
Omnibus: 0.952 Durbin-Watson: 1.709
Prob(Omnibus): 0.621 Jarque-Bera (JB): 0.926
Skew: 0.256 Prob(JB): 0.629
Kurtosis: 2.308 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour CoP_unload_ML.Larg:
OLS Regression Results
==============================================================================
Dep. Variable: CoP_unload_ML.Larg R-squared: 0.003
Model: OLS Adj. R-squared: -0.032
Method: Least Squares F-statistic: 0.09699
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.758
Time: 11:00:46 Log-Likelihood: 44.597
No. Observations: 30 AIC: -85.19
Df Residuals: 28 BIC: -82.39
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.2925 0.054 5.434 0.000 0.182 0.403
Age 0.0019 0.006 0.311 0.758 -0.011 0.014
==============================================================================
Omnibus: 4.589 Durbin-Watson: 1.493
Prob(Omnibus): 0.101 Jarque-Bera (JB): 3.449
Skew: -0.825 Prob(JB): 0.178
Kurtosis: 3.197 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour Vpic_load_AP.ms:
OLS Regression Results
==============================================================================
Dep. Variable: Vpic_load_AP.ms R-squared: 0.169
Model: OLS Adj. R-squared: 0.140
Method: Least Squares F-statistic: 5.710
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.0238
Time: 11:00:47 Log-Likelihood: 30.393
No. Observations: 30 AIC: -56.79
Df Residuals: 28 BIC: -53.98
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0152 0.086 0.176 0.862 -0.162 0.192
Age 0.0235 0.010 2.390 0.024 0.003 0.044
==============================================================================
Omnibus: 0.432 Durbin-Watson: 1.833
Prob(Omnibus): 0.806 Jarque-Bera (JB): 0.077
Skew: 0.122 Prob(JB): 0.962
Kurtosis: 3.046 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
L'effet de l'âge sur Vpic_load_AP.ms est significatif (p-value: 0.0238)
Résultats de la régression pour Vpic_load_ML.ms:
OLS Regression Results
==============================================================================
Dep. Variable: Vpic_load_ML.ms R-squared: 0.103
Model: OLS Adj. R-squared: 0.071
Method: Least Squares F-statistic: 3.224
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.0834
Time: 11:00:47 Log-Likelihood: 24.453
No. Observations: 30 AIC: -44.91
Df Residuals: 28 BIC: -42.10
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0982 0.105 0.932 0.359 -0.118 0.314
Age 0.0216 0.012 1.796 0.083 -0.003 0.046
==============================================================================
Omnibus: 0.699 Durbin-Watson: 1.664
Prob(Omnibus): 0.705 Jarque-Bera (JB): 0.769
Skew: 0.233 Prob(JB): 0.681
Kurtosis: 2.368 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour Vpic_unload_ML.ms:
OLS Regression Results
==============================================================================
Dep. Variable: Vpic_unload_ML.ms R-squared: 0.001
Model: OLS Adj. R-squared: -0.034
Method: Least Squares F-statistic: 0.03913
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.845
Time: 11:00:47 Log-Likelihood: -7.7890
No. Observations: 30 AIC: 19.58
Df Residuals: 28 BIC: 22.38
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 1.3049 0.309 4.230 0.000 0.673 1.937
Age -0.0070 0.035 -0.198 0.845 -0.079 0.065
==============================================================================
Omnibus: 1.697 Durbin-Watson: 2.683
Prob(Omnibus): 0.428 Jarque-Bera (JB): 1.421
Skew: 0.375 Prob(JB): 0.491
Kurtosis: 2.241 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour BOS_AP_Init.m:
OLS Regression Results
==============================================================================
Dep. Variable: BOS_AP_Init.m R-squared: 0.511
Model: OLS Adj. R-squared: 0.494
Method: Least Squares F-statistic: 29.31
Date: Wed, 05 Mar 2025 Prob (F-statistic): 8.96e-06
Time: 11:00:47 Log-Likelihood: 94.627
No. Observations: 30 AIC: -185.3
Df Residuals: 28 BIC: -182.5
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.1172 0.010 11.542 0.000 0.096 0.138
Age 0.0063 0.001 5.414 0.000 0.004 0.009
==============================================================================
Omnibus: 1.577 Durbin-Watson: 2.337
Prob(Omnibus): 0.454 Jarque-Bera (JB): 1.247
Skew: -0.296 Prob(JB): 0.536
Kurtosis: 2.195 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
L'effet de l'âge sur BOS_AP_Init.m est significatif (p-value: 0.0000)
Résultats de la régression pour BOS_ML_Init.m:
OLS Regression Results
==============================================================================
Dep. Variable: BOS_ML_Init.m R-squared: 0.003
Model: OLS Adj. R-squared: -0.033
Method: Least Squares F-statistic: 0.08326
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.775
Time: 11:00:48 Log-Likelihood: 68.754
No. Observations: 30 AIC: -133.5
Df Residuals: 28 BIC: -130.7
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.2459 0.024 10.223 0.000 0.197 0.295
Age -0.0008 0.003 -0.289 0.775 -0.006 0.005
==============================================================================
Omnibus: 0.391 Durbin-Watson: 2.335
Prob(Omnibus): 0.823 Jarque-Bera (JB): 0.516
Skew: 0.224 Prob(JB): 0.772
Kurtosis: 2.538 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour MOS_AP_FOcr.Long:
OLS Regression Results
==============================================================================
Dep. Variable: MOS_AP_FOcr.Long R-squared: 0.000
Model: OLS Adj. R-squared: -0.036
Method: Least Squares F-statistic: 0.0009576
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.976
Time: 11:00:48 Log-Likelihood: 2.5794
No. Observations: 30 AIC: -1.159
Df Residuals: 28 BIC: 1.644
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.8322 0.218 -3.811 0.001 -1.279 -0.385
Age -0.0008 0.025 -0.031 0.976 -0.052 0.050
==============================================================================
Omnibus: 2.748 Durbin-Watson: 2.440
Prob(Omnibus): 0.253 Jarque-Bera (JB): 1.444
Skew: 0.442 Prob(JB): 0.486
Kurtosis: 3.611 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Résultats de la régression pour MOS_ML_FOcr.Larg:
OLS Regression Results
==============================================================================
Dep. Variable: MOS_ML_FOcr.Larg R-squared: 0.030
Model: OLS Adj. R-squared: -0.005
Method: Least Squares F-statistic: 0.8637
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.361
Time: 11:00:48 Log-Likelihood: 34.234
No. Observations: 30 AIC: -64.47
Df Residuals: 28 BIC: -61.67
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1303 0.076 -1.714 0.098 -0.286 0.025
Age 0.0081 0.009 0.929 0.361 -0.010 0.026
==============================================================================
Omnibus: 2.161 Durbin-Watson: 2.099
Prob(Omnibus): 0.340 Jarque-Bera (JB): 0.988
Skew: 0.332 Prob(JB): 0.610
Kurtosis: 3.592 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
import statsmodels.api as sm
resultats = [] # Liste pour stocker les résultats
for colonne in colonnes_initiation_marche:
X = sm.add_constant(df['Age'])
y = df[colonne]
model = sm.OLS(y, X).fit()
p_value = model.pvalues['Age']
r_squared = model.rsquared
significativite = "Significatif" if p_value < 0.05 else "Non significatif"
resultats.append({
'Variable': colonne,
'P-value': p_value,
'R²': r_squared,
'Significativité': significativite
})
# Créer un DataFrame à partir des résultats
tableau_resultats = pd.DataFrame(resultats)
print(tableau_resultats)
Variable P-value R² Significativité 0 TAju.ms 0.953812 0.000122 Non significatif 1 TExe.ms 0.877644 0.000861 Non significatif 2 TPas.ms 0.879445 0.000836 Non significatif 3 TLoad.ms 0.553808 0.012664 Non significatif 4 TUnload.ms 0.495385 0.016757 Non significatif 5 CoP_tot_AP.Long 0.256820 0.045670 Non significatif 6 CoP_tot_ML.Larg 0.264945 0.044174 Non significatif 7 CoP_loadAP.Long 0.477618 0.018168 Non significatif 8 CoP_load_ML.Larg 0.059785 0.120853 Non significatif 9 CoP_unload_ML.Larg 0.757779 0.003452 Non significatif 10 Vpic_load_AP.ms 0.023842 0.169388 Significatif 11 Vpic_load_ML.ms 0.083359 0.103259 Non significatif 12 Vpic_unload_ML.ms 0.844614 0.001396 Non significatif 13 BOS_AP_Init.m 0.000009 0.511428 Significatif 14 BOS_ML_Init.m 0.775050 0.002965 Non significatif 15 MOS_AP_FOcr.Long 0.975533 0.000034 Non significatif 16 MOS_ML_FOcr.Larg 0.360656 0.029922 Non significatif
Les variables pour lesquels l'âge a un effet significative est : Vpic_load_AP.ms & BOS_AP_Init.m
Q3.4
1. Analyse univariée : Effet de l'âge sur la taille et le poids
Régression linéaire simple
for var in ["Height", "Weight"]:
X = sm.add_constant(df["Age"]) # Ajout de l'âge comme variable explicative
y = df[var] # Variable dépendante
model = sm.OLS(y, X).fit()
print(f"\n🔹 Régression de {var} sur l'âge")
print(model.summary())
# 📉 Tracé du nuage de points avec la droite de régression
plt.figure(figsize=(8,5))
sns.regplot(x=df['Age'], y=df[var], scatter_kws={'alpha':0.5}, line_kws={"color": "red"})
plt.title(f"Régression linéaire : {var} ~ Age")
plt.xlabel("Age")
plt.ylabel(var)
plt.show()
🔹 Régression de Height sur l'âge
OLS Regression Results
==============================================================================
Dep. Variable: Height R-squared: 0.632
Model: OLS Adj. R-squared: 0.619
Method: Least Squares F-statistic: 48.03
Date: Wed, 05 Mar 2025 Prob (F-statistic): 1.56e-07
Time: 11:00:49 Log-Likelihood: -97.842
No. Observations: 30 AIC: 199.7
Df Residuals: 28 BIC: 202.5
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 92.5157 6.208 14.904 0.000 79.800 105.231
Age 4.9037 0.708 6.930 0.000 3.454 6.353
==============================================================================
Omnibus: 0.389 Durbin-Watson: 1.701
Prob(Omnibus): 0.823 Jarque-Bera (JB): 0.529
Skew: -0.212 Prob(JB): 0.767
Kurtosis: 2.507 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
🔹 Régression de Weight sur l'âge
OLS Regression Results
==============================================================================
Dep. Variable: Weight R-squared: 0.421
Model: OLS Adj. R-squared: 0.400
Method: Least Squares F-statistic: 20.33
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.000106
Time: 11:00:49 Log-Likelihood: -94.304
No. Observations: 30 AIC: 192.6
Df Residuals: 28 BIC: 195.4
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 5.2120 5.517 0.945 0.353 -6.089 16.513
Age 2.8356 0.629 4.509 0.000 1.547 4.124
==============================================================================
Omnibus: 2.070 Durbin-Watson: 2.143
Prob(Omnibus): 0.355 Jarque-Bera (JB): 1.204
Skew: 0.482 Prob(JB): 0.548
Kurtosis: 3.186 Cond. No. 46.2
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Interprétation des résultats
Si le coefficient de l'âge est significatif (p-value < 0.05), cela indique que l'âge a un effet significatif sur la taille ou le poids.
Cependant, cette analyse ne tient pas compte des effets potentiels de la taille sur le poids, ou vice versa.
2. Analyse multivariée : Contrôle des effets de la taille et du poids
Pour vérifier que les effets de l'âge ne sont pas confondus par la taille ou le poids, nous pouvons utiliser une régression linéaire multiple. Cela permet de contrôler l'effet de plusieurs variables en même temps.
**Vérifions si l'effet combiné de l'âge, la taille et le poids sur l'anticipation disparaît après contrôle**
for colonne in colonnes_initiation_marche:
X = df[['Age', 'Height', 'Weight']] # Variables explicatives
X = sm.add_constant(X) # Ajout de la constante
y = df[colonne] # Variable dépendante
model = sm.OLS(y, X).fit()
print(f"\n🔹 Régression de {colonne} sur l'âge, la taille et le poids")
print(model.summary())
🔹 Régression de TAju.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: TAju.ms R-squared: 0.092
Model: OLS Adj. R-squared: -0.013
Method: Least Squares F-statistic: 0.8801
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.464
Time: 11:00:49 Log-Likelihood: -177.97
No. Observations: 30 AIC: 363.9
Df Residuals: 26 BIC: 369.6
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -138.2103 402.812 -0.343 0.734 -966.202 689.781
Age -18.2758 17.686 -1.033 0.311 -54.631 18.079
Height 7.1966 4.450 1.617 0.118 -1.950 16.343
Weight -5.7788 5.007 -1.154 0.259 -16.070 4.512
==============================================================================
Omnibus: 6.509 Durbin-Watson: 2.860
Prob(Omnibus): 0.039 Jarque-Bera (JB): 7.017
Skew: -0.385 Prob(JB): 0.0299
Kurtosis: 5.241 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de TExe.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: TExe.ms R-squared: 0.158
Model: OLS Adj. R-squared: 0.060
Method: Least Squares F-statistic: 1.621
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.209
Time: 11:00:49 Log-Likelihood: -180.32
No. Observations: 30 AIC: 368.6
Df Residuals: 26 BIC: 374.3
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 1184.8704 435.631 2.720 0.011 289.419 2080.322
Age 23.9426 19.127 1.252 0.222 -15.374 63.260
Height -10.4454 4.812 -2.171 0.039 -20.337 -0.554
Weight 10.2799 5.414 1.899 0.069 -0.850 21.409
==============================================================================
Omnibus: 2.238 Durbin-Watson: 1.704
Prob(Omnibus): 0.327 Jarque-Bera (JB): 1.991
Skew: 0.591 Prob(JB): 0.370
Kurtosis: 2.559 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de TPas.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: TPas.ms R-squared: 0.013
Model: OLS Adj. R-squared: -0.101
Method: Least Squares F-statistic: 0.1149
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.951
Time: 11:00:49 Log-Likelihood: -191.82
No. Observations: 30 AIC: 391.6
Df Residuals: 26 BIC: 397.2
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 1046.6601 639.025 1.638 0.113 -266.874 2360.194
Age 5.6668 28.058 0.202 0.842 -52.007 63.341
Height -3.2488 7.059 -0.460 0.649 -17.759 11.261
Weight 4.5011 7.942 0.567 0.576 -11.825 20.827
==============================================================================
Omnibus: 0.870 Durbin-Watson: 2.012
Prob(Omnibus): 0.647 Jarque-Bera (JB): 0.860
Skew: 0.224 Prob(JB): 0.651
Kurtosis: 2.303 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de TLoad.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: TLoad.ms R-squared: 0.069
Model: OLS Adj. R-squared: -0.039
Method: Least Squares F-statistic: 0.6394
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.597
Time: 11:00:49 Log-Likelihood: -172.66
No. Observations: 30 AIC: 353.3
Df Residuals: 26 BIC: 358.9
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 22.3399 337.383 0.066 0.948 -671.161 715.841
Age -8.4238 14.814 -0.569 0.574 -38.874 22.026
Height 3.6718 3.727 0.985 0.334 -3.989 11.332
Weight -5.2433 4.193 -1.250 0.222 -13.863 3.376
==============================================================================
Omnibus: 0.169 Durbin-Watson: 2.492
Prob(Omnibus): 0.919 Jarque-Bera (JB): 0.367
Skew: 0.111 Prob(JB): 0.833
Kurtosis: 2.507 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de TUnload.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: TUnload.ms R-squared: 0.084
Model: OLS Adj. R-squared: -0.021
Method: Least Squares F-statistic: 0.7985
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.506
Time: 11:00:49 Log-Likelihood: -171.57
No. Observations: 30 AIC: 351.1
Df Residuals: 26 BIC: 356.7
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -160.5503 325.334 -0.493 0.626 -829.283 508.183
Age -9.8520 14.285 -0.690 0.496 -39.214 19.510
Height 3.5247 3.594 0.981 0.336 -3.862 10.912
Weight -0.5355 4.044 -0.132 0.896 -8.847 7.776
==============================================================================
Omnibus: 1.936 Durbin-Watson: 2.556
Prob(Omnibus): 0.380 Jarque-Bera (JB): 1.449
Skew: 0.535 Prob(JB): 0.484
Kurtosis: 2.872 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de CoP_tot_AP.Long sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: CoP_tot_AP.Long R-squared: 0.107
Model: OLS Adj. R-squared: 0.004
Method: Least Squares F-statistic: 1.041
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.391
Time: 11:00:49 Log-Likelihood: 88.122
No. Observations: 30 AIC: -168.2
Df Residuals: 26 BIC: -162.6
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.0270 0.057 -0.477 0.637 -0.143 0.089
Age -0.0009 0.002 -0.372 0.713 -0.006 0.004
Height 0.0006 0.001 0.927 0.363 -0.001 0.002
Weight -6.95e-05 0.001 -0.099 0.922 -0.002 0.001
==============================================================================
Omnibus: 0.407 Durbin-Watson: 1.855
Prob(Omnibus): 0.816 Jarque-Bera (JB): 0.395
Skew: 0.243 Prob(JB): 0.821
Kurtosis: 2.718 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de CoP_tot_ML.Larg sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: CoP_tot_ML.Larg R-squared: 0.464
Model: OLS Adj. R-squared: 0.403
Method: Least Squares F-statistic: 7.517
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.000883
Time: 11:00:49 Log-Likelihood: 82.092
No. Observations: 30 AIC: -156.2
Df Residuals: 26 BIC: -150.6
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1079 0.069 -1.558 0.131 -0.250 0.034
Age -0.0081 0.003 -2.655 0.013 -0.014 -0.002
Height 0.0021 0.001 2.797 0.010 0.001 0.004
Weight 9.002e-05 0.001 0.105 0.917 -0.002 0.002
==============================================================================
Omnibus: 0.526 Durbin-Watson: 2.121
Prob(Omnibus): 0.769 Jarque-Bera (JB): 0.628
Skew: -0.127 Prob(JB): 0.731
Kurtosis: 2.339 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de CoP_loadAP.Long sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: CoP_loadAP.Long R-squared: 0.064
Model: OLS Adj. R-squared: -0.044
Method: Least Squares F-statistic: 0.5907
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.627
Time: 11:00:49 Log-Likelihood: 34.718
No. Observations: 30 AIC: -61.44
Df Residuals: 26 BIC: -55.83
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.0979 0.336 -0.292 0.773 -0.788 0.592
Age -0.0067 0.015 -0.454 0.653 -0.037 0.024
Height 0.0026 0.004 0.697 0.492 -0.005 0.010
Weight 0.0001 0.004 0.027 0.979 -0.008 0.009
==============================================================================
Omnibus: 3.094 Durbin-Watson: 1.818
Prob(Omnibus): 0.213 Jarque-Bera (JB): 2.338
Skew: -0.534 Prob(JB): 0.311
Kurtosis: 2.146 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de CoP_load_ML.Larg sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: CoP_load_ML.Larg R-squared: 0.269
Model: OLS Adj. R-squared: 0.185
Method: Least Squares F-statistic: 3.195
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.0400
Time: 11:00:49 Log-Likelihood: 49.232
No. Observations: 30 AIC: -90.46
Df Residuals: 26 BIC: -84.86
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1773 0.207 -0.857 0.399 -0.603 0.248
Age -0.0043 0.009 -0.477 0.637 -0.023 0.014
Height 0.0026 0.002 1.138 0.265 -0.002 0.007
Weight 0.0010 0.003 0.395 0.696 -0.004 0.006
==============================================================================
Omnibus: 0.913 Durbin-Watson: 1.952
Prob(Omnibus): 0.633 Jarque-Bera (JB): 0.854
Skew: 0.189 Prob(JB): 0.652
Kurtosis: 2.264 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de CoP_unload_ML.Larg sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: CoP_unload_ML.Larg R-squared: 0.181
Model: OLS Adj. R-squared: 0.087
Method: Least Squares F-statistic: 1.922
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.151
Time: 11:00:49 Log-Likelihood: 47.549
No. Observations: 30 AIC: -87.10
Df Residuals: 26 BIC: -81.49
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.2005 0.219 -0.916 0.368 -0.651 0.250
Age -0.0148 0.010 -1.539 0.136 -0.035 0.005
Height 0.0055 0.002 2.289 0.030 0.001 0.011
Weight -0.0037 0.003 -1.353 0.188 -0.009 0.002
==============================================================================
Omnibus: 1.593 Durbin-Watson: 1.444
Prob(Omnibus): 0.451 Jarque-Bera (JB): 1.346
Skew: -0.496 Prob(JB): 0.510
Kurtosis: 2.699 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de Vpic_load_AP.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: Vpic_load_AP.ms R-squared: 0.230
Model: OLS Adj. R-squared: 0.141
Method: Least Squares F-statistic: 2.582
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.0750
Time: 11:00:49 Log-Likelihood: 31.521
No. Observations: 30 AIC: -55.04
Df Residuals: 26 BIC: -49.44
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1647 0.374 -0.441 0.663 -0.932 0.603
Age 0.0077 0.016 0.472 0.641 -0.026 0.041
Height 0.0018 0.004 0.438 0.665 -0.007 0.010
Weight 0.0024 0.005 0.527 0.603 -0.007 0.012
==============================================================================
Omnibus: 0.224 Durbin-Watson: 1.819
Prob(Omnibus): 0.894 Jarque-Bera (JB): 0.426
Skew: 0.037 Prob(JB): 0.808
Kurtosis: 2.421 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de Vpic_load_ML.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: Vpic_load_ML.ms R-squared: 0.412
Model: OLS Adj. R-squared: 0.344
Method: Least Squares F-statistic: 6.080
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.00281
Time: 11:00:49 Log-Likelihood: 30.791
No. Observations: 30 AIC: -53.58
Df Residuals: 26 BIC: -47.98
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.8119 0.383 -2.121 0.044 -1.599 -0.025
Age -0.0272 0.017 -1.617 0.118 -0.062 0.007
Height 0.0098 0.004 2.324 0.028 0.001 0.019
Weight 0.0002 0.005 0.041 0.968 -0.010 0.010
==============================================================================
Omnibus: 0.368 Durbin-Watson: 1.835
Prob(Omnibus): 0.832 Jarque-Bera (JB): 0.504
Skew: -0.213 Prob(JB): 0.777
Kurtosis: 2.530 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de Vpic_unload_ML.ms sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: Vpic_unload_ML.ms R-squared: 0.034
Model: OLS Adj. R-squared: -0.077
Method: Least Squares F-statistic: 0.3068
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.820
Time: 11:00:49 Log-Likelihood: -7.2881
No. Observations: 30 AIC: 22.58
Df Residuals: 26 BIC: 28.18
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.3129 1.362 0.230 0.820 -2.487 3.112
Age -0.0190 0.060 -0.317 0.754 -0.142 0.104
Height 0.0116 0.015 0.772 0.447 -0.019 0.043
Weight -0.0158 0.017 -0.936 0.358 -0.051 0.019
==============================================================================
Omnibus: 0.800 Durbin-Watson: 2.651
Prob(Omnibus): 0.670 Jarque-Bera (JB): 0.844
Skew: 0.262 Prob(JB): 0.656
Kurtosis: 2.367 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de BOS_AP_Init.m sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: BOS_AP_Init.m R-squared: 0.807
Model: OLS Adj. R-squared: 0.785
Method: Least Squares F-statistic: 36.32
Date: Wed, 05 Mar 2025 Prob (F-statistic): 1.91e-09
Time: 11:00:49 Log-Likelihood: 108.59
No. Observations: 30 AIC: -209.2
Df Residuals: 26 BIC: -203.6
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0423 0.029 1.479 0.151 -0.017 0.101
Age 0.0006 0.001 0.503 0.620 -0.002 0.003
Height 0.0008 0.000 2.444 0.022 0.000 0.001
Weight 0.0007 0.000 1.830 0.079 -8.03e-05 0.001
==============================================================================
Omnibus: 4.496 Durbin-Watson: 1.731
Prob(Omnibus): 0.106 Jarque-Bera (JB): 3.078
Skew: -0.753 Prob(JB): 0.215
Kurtosis: 3.441 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de BOS_ML_Init.m sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: BOS_ML_Init.m R-squared: 0.201
Model: OLS Adj. R-squared: 0.109
Method: Least Squares F-statistic: 2.178
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.115
Time: 11:00:49 Log-Likelihood: 72.073
No. Observations: 30 AIC: -136.1
Df Residuals: 26 BIC: -130.5
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.2037 0.097 2.107 0.045 0.005 0.402
Age -0.0071 0.004 -1.683 0.104 -0.016 0.002
Height 0.0004 0.001 0.342 0.735 -0.002 0.003
Weight 0.0016 0.001 1.338 0.192 -0.001 0.004
==============================================================================
Omnibus: 0.496 Durbin-Watson: 2.469
Prob(Omnibus): 0.780 Jarque-Bera (JB): 0.539
Skew: 0.271 Prob(JB): 0.764
Kurtosis: 2.628 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de MOS_AP_FOcr.Long sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: MOS_AP_FOcr.Long R-squared: 0.020
Model: OLS Adj. R-squared: -0.093
Method: Least Squares F-statistic: 0.1762
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.912
Time: 11:00:49 Log-Likelihood: 2.8808
No. Observations: 30 AIC: 2.238
Df Residuals: 26 BIC: 7.843
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1985 0.970 -0.205 0.839 -2.193 1.796
Age 0.0117 0.043 0.274 0.786 -0.076 0.099
Height -0.0073 0.011 -0.682 0.501 -0.029 0.015
Weight 0.0083 0.012 0.685 0.500 -0.017 0.033
==============================================================================
Omnibus: 2.977 Durbin-Watson: 2.479
Prob(Omnibus): 0.226 Jarque-Bera (JB): 1.605
Skew: 0.447 Prob(JB): 0.448
Kurtosis: 3.696 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
🔹 Régression de MOS_ML_FOcr.Larg sur l'âge, la taille et le poids
OLS Regression Results
==============================================================================
Dep. Variable: MOS_ML_FOcr.Larg R-squared: 0.184
Model: OLS Adj. R-squared: 0.090
Method: Least Squares F-statistic: 1.954
Date: Wed, 05 Mar 2025 Prob (F-statistic): 0.146
Time: 11:00:49 Log-Likelihood: 36.829
No. Observations: 30 AIC: -65.66
Df Residuals: 26 BIC: -60.05
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.5350 0.313 1.709 0.099 -0.108 1.178
Age 0.0247 0.014 1.797 0.084 -0.004 0.053
Height -0.0076 0.003 -2.199 0.037 -0.015 -0.000
Weight 0.0073 0.004 1.870 0.073 -0.001 0.015
==============================================================================
Omnibus: 0.535 Durbin-Watson: 2.095
Prob(Omnibus): 0.765 Jarque-Bera (JB): 0.053
Skew: 0.071 Prob(JB): 0.974
Kurtosis: 3.149 Cond. No. 3.12e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 3.12e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
Récapitulatif des régressions effectuées
import pandas as pd
import statsmodels.api as sm
# Stocker les résultats dans une liste
results_list = []
for colonne in colonnes_initiation_marche:
X = df[['Age', 'Height', 'Weight']] # Variables explicatives
X = sm.add_constant(X) # Ajout de la constante
y = df[colonne] # Variable dépendante
model = sm.OLS(y, X).fit()
# Récupération des p-values
p_values = model.pvalues
# Ajout des résultats dans la liste
for var in ['const', 'Age', 'Height', 'Weight']:
results_list.append({
'Variable dépendante': colonne,
'Variable explicative': var,
'p-value': p_values[var],
'Significatif': '✅ Oui' if p_values[var] < 0.05 else '❌ Non'
})
# Création du DataFrame récapitulatif
df_results = pd.DataFrame(results_list)
# Affichage du tableau
print("\n📊 Tableau des p-values et significativité :")
print(df_results)
# Option pour enregistrer le tableau en CSV
df_results.to_csv("resultats_regression.csv", index=False)
📊 Tableau des p-values et significativité : Variable dépendante Variable explicative p-value Significatif 0 TAju.ms const 0.734272 ❌ Non 1 TAju.ms Age 0.310971 ❌ Non 2 TAju.ms Height 0.117873 ❌ Non 3 TAju.ms Weight 0.258894 ❌ Non 4 TExe.ms const 0.011484 ✅ Oui .. ... ... ... ... 63 MOS_AP_FOcr.Long Weight 0.499656 ❌ Non 64 MOS_ML_FOcr.Larg const 0.099297 ❌ Non 65 MOS_ML_FOcr.Larg Age 0.083888 ❌ Non 66 MOS_ML_FOcr.Larg Height 0.037009 ✅ Oui 67 MOS_ML_FOcr.Larg Weight 0.072811 ❌ Non [68 rows x 4 columns]
Affichage des variables significatives uniquement
# Stocker les résultats dans une liste
results_list = []
for colonne in colonnes_initiation_marche:
X = df[['Age', 'Height', 'Weight']] # Variables explicatives
X = sm.add_constant(X) # Ajout de la constante
y = df[colonne] # Variable dépendante
model = sm.OLS(y, X).fit()
# Récupération des p-values
p_values = model.pvalues
# Ajouter uniquement les résultats significatifs (p < 0.05)
for var in ['const', 'Age', 'Height', 'Weight']:
if p_values[var] < 0.05: # Condition pour filtrer uniquement les variables significatives
results_list.append({
'Variable dépendante': colonne,
'Variable explicative': var,
'p-value': round(p_values[var], 5), # Arrondi pour lisibilité
'Significatif': '✅ Oui'
})
# Création du DataFrame récapitulatif
df_results = pd.DataFrame(results_list)
# Affichage du tableau uniquement si des valeurs significatives existent
if not df_results.empty:
print("\n📊 Tableau des variables explicatives significatives :")
print(df_results)
else:
print("\n❌ Aucune relation significative trouvée.")
📊 Tableau des variables explicatives significatives : Variable dépendante Variable explicative p-value Significatif 0 TExe.ms const 0.01148 ✅ Oui 1 TExe.ms Height 0.03928 ✅ Oui 2 CoP_tot_ML.Larg Age 0.01335 ✅ Oui 3 CoP_tot_ML.Larg Height 0.00958 ✅ Oui 4 CoP_unload_ML.Larg Height 0.03045 ✅ Oui 5 Vpic_load_ML.ms const 0.04359 ✅ Oui 6 Vpic_load_ML.ms Height 0.02820 ✅ Oui 7 BOS_AP_Init.m Height 0.02162 ✅ Oui 8 BOS_ML_Init.m const 0.04488 ✅ Oui 9 MOS_ML_FOcr.Larg Height 0.03701 ✅ Oui
Interprétation des résultats
Certaines variables dépendantes sont influencées par la taille ( Height) Par exemple, TExe.ms est significativement influencé par Height(p = 0,03928). De même, CoP_tot_ML.Larg, CoP_unload_ML.Larg, Vpic_load_ML.ms, BOS_AP_Init.m, etc. ont tous un effet significatif de la taille .
Cela signifie que la taille a une relation significative avec ces mesures.
L'âge ( Age) influence seulement CoP_tot_ML.Larg
p-value = 0.01335→ effet significatif de l'âge sur CoP_tot_ML.Larg.
Cela montre que l'âge peut être un facteur influençant cette variable, mais pas les autres mesures.
Conséquences
L'âge semble avoir un effet limité : il n'est significatif que pour CoP_tot_ML.Larg. Cela signifie que l'évolution des autres variables dépendantes n'est pas due à l'âge , mais plutôt à d'autres facteurs comme la taille.
La taille ( Height) a un effet plus important : plusieurs variables sont significativement influencées par la taille, ce qui suggère qu'elle joue un rôle clé dans ces mesures.
Le poids ( Weight) n'est pas significatif : Il ne figure pas dans le tableau, ce qui signifie que son effet sur les variables dépendantes n'est pas statistiquement prouvé.